用戶:Xyy23330121/Python/字典

來自維基學院


創建字典[編輯 | 編輯原始碼]

基本的創建和使用[編輯 | 編輯原始碼]

a = {"key1": "value1", "key2": "value2"}  #创建字典
print(a["key1"])   #输出:value1
b = {}             #创建空字典

以上示例是一個簡單的、使用字典的方法。通過輸入正確的鍵,我們可以從字典得到該鍵對應的值。

幾乎所有變量都可以作為字典的鍵,但可變類型(列表、字典等)不可作為字典的鍵。

比較運算結果相等的值,比如整數1、浮點數1.0和布爾值True,可以被互換使用,並索引到同一個值。

用推導式生成字典[編輯 | 編輯原始碼]

類似列表,字典也有推導式。我們看以下示例:

a = {x: x ** 2 for x in range(10) if x not in range(:10:2)}
print(a[5])   #输出:25
b = {x: x ** 3 for x in range(10)}
print(b[5])   #输出:125

zip 函數[編輯 | 編輯原始碼]

使用 zip 函數[1],我們可以同時迭代多個可迭代對象。迭代次數按可迭代次數最少的對象來指定。比如:

print(list(zip("Python","012")))  #输出:[('P', '0'), ('y', '1'), ('t', '2')]

於是,我們可以利用該函數配合生成器高效地創建字典,比如:

a = {x: y*3 for x,y in zip(range(10),"Python")}
print(a[5])   #输出:nnn

zip 函數之外,Python 內置的 itertools 模塊實現了更多高級的可迭代對象作為循環迭代的工具。讀者可以查閱對應的 Python 模塊文檔進行補充。

用 dict 函數創建字典[編輯 | 編輯原始碼]

我們也可以用 dict 函數來創建字典。比如:

a = dict(one=1, two=2, three=3)
b = dict([("one",1),("two",2),["three",3]])
c = dict((("one",1),["three",3]), two = 2)
print(a==b==c)    #输出:True
d = dict()        #创建空字典

由長度為 2 的列表或元組構成的列表或元組可以直接轉化為字典。同時,也可以用類似傳入參數的方式生成字典。

要注意,以下的方式是不合法的:

dict(0 = 1)  #报错:SyntaxError

對於不符合變量命名規則的鍵(比如「數字」或「字符串以數字開頭」的鍵),就不能用這種方法。

用 dict.fromkeys 創建字典[編輯 | 編輯原始碼]

該方法有兩個參數:

  1. iterable:由可以作為字典鍵的元素構成的可迭代對象
  2. value:(可選)這些鍵對應的值,默認為None

我們看以下示例:

a = dict.fromkeys("Python",3)
print(a)
#输出:{'P': 3, 'y': 3, 't': 3, 'h': 3, 'o': 3, 'n': 3}

字典的操作[編輯 | 編輯原始碼]

可迭代序列[編輯 | 編輯原始碼]

字典是可迭代序列。當對它進行迭代時,等同於對它的「鍵」進行迭代。迭代順序則是按「鍵」被輸入的順序進行。

我們可以通過 listtuple 函數確認這一點。

a = dict.fromkeys("Python",3) #按顺序输入了键 "P" "y" "t" "h" "o" "n"
print(list(a))

類似其它可迭代序列,len 函數會返回字典的項數。而 innot in 則會判斷「鍵」在/不在字典中。

簡單操作[編輯 | 編輯原始碼]

讀取字典的值[編輯 | 編輯原始碼]

dict[key][編輯 | 編輯原始碼]

對於創建的一個字典對象 d = {0 : "zero"},可以使用 d[0] 來讀取 d 中對應鍵0 的值。但如果字典中沒有鍵 0 則會報錯。

此方法僅適用於程式設計師已經明確了解,所使用的索引是字典的鍵的時候。如果程式設計師不知道,則可以參照以下dict.get方法。

dict.get(key[, default])[編輯 | 編輯原始碼]

我們看以下示例:

d = {0 : "zero"}
print(d.get(0))        #输出:zero
print(d.get(1))        #输出:None
print(d.get(1,"one"))  #输出:one

default 參數的默認值是 None 。如果參數 key 是字典 d 中的鍵,則 d.get(key) 會返回 d[key] 的值。反之,會返回 default 參數的值。

給字典元素賦值[編輯 | 編輯原始碼]

dict[key] = value[編輯 | 編輯原始碼]

我們看以下示例:

d = {0 : "zero"}
d[0] = "Zero"  #将 d 中对应键 0 的值更新为 "Zero"。
print(d)       #输出:{0: 'Zero'}
d[1] = "One"   #在 d 中创建新键 1,使其值为 "One"。
print(d)       #输出:{0: 'Zero', 1: 'One'}

這種方式無論鍵是否已經存在,都會對字典進行修改。

dict.setdefault(key[, default])[編輯 | 編輯原始碼]

我們看以下示例:

d = {0 : "zero"}
dict.setdefault(0, "Zero")  #查找 d 中是否已有键 0,由于已有键 0,这里不操作。
print(d)       #输出:{0: 'zero'}
dict.setdefault(1, "One")   #查找 d 中是否已有键 1,由于没有键 1,这里创建新键 1,使其值为 "One"。
print(d)       #输出:{0: 'zero', 1: 'One'}

這種方式只有在鍵不存在時,才會進行修改。

刪除字典元素[編輯 | 編輯原始碼]

del dict[key][編輯 | 編輯原始碼]

del d[key] 會刪除字典 d 中,對應鍵 key 的項目。如果沒有符合鍵 key 的項目,則會報錯 KeyError

dict.pop(key[, default])[編輯 | 編輯原始碼]

使用 d.pop 時。如果 key 存在於字典 d 中,則將其移除並返回其值;
如果 key 不在 d 中,則返回 default 的值。此時,如果 default 未給出,則會報錯 KeyError

dict.popitem()[編輯 | 編輯原始碼]

d.popitem 會以「後進先出」的原則,刪除字典 d 中最後一個鍵及其對應的值,並返回其值。如果 d 是空字典,則會報錯。

可變序列操作[編輯 | 編輯原始碼]

字典同時也是可變序列。與可變序列「列表」相同,如果使用以下方法:

a = {0: None, 1: True}
b = a
b[0] = False
print(a)     #输出:{0: False, 1: True}

在更改 b 的時候,會導致 a 的值也發生改變。這是因為 ba 本質上是同一個對象。

字典支持可變序列的這兩個操作:

  1. dict.clear():對於已有的字典 dd.clear() 會清除 d 中的一切鍵值對,使其變成一個空字典。
  2. dict.copy():對於已有的字典 dd.copy() 會返回 d 的一個複製。

用另一字典對字典進行更新[編輯 | 編輯原始碼]

dict.update([other]) 或 dict |= other[編輯 | 編輯原始碼]

這兩個方法都會取 other 的值來更新 dict 的值。其結果等同於:

for key in other:
    dict[key] = other[key]

other 一般是一個字典,但也可以是任何「可以用dict函數轉化為字典的」對象。

對於 dict.update 的情況,還可以使用這種方式:

dict.update(key = value)

dict | other[編輯 | 編輯原始碼]

返回一個「相當於 dictother 更新後的字典」的新字典。而 dict 不會被更改。

返回所有鍵、所有值、或所有鍵值對[編輯 | 編輯原始碼]

Python 提供了以下三種方法:

  1. dict.items():返回所有鍵值對元組(键, 值)構成的視圖
  2. dict.keys():返回所有鍵構成的視圖
  3. dict.values():返回所有值構成的視圖

視圖[編輯 | 編輯原始碼]

字典的視圖簡單來講就是隨着字典更新而更新的可迭代序列。視圖支持 len 函數、比較運算 innot in 以及一些其它操作。其他操作不多贅述。

參考文獻[編輯 | 編輯原始碼]