像列表一樣,字典(dict)是許多值的集合。但不像列表的下標,字典的索引可以使用許多不同數據類型,不只是整數。字典的索引被稱為“鍵”,鍵及其關聯的值稱為鍵-值對。 ...
blog:https://www.cnblogs.com/Rohn
Tips:本文中代碼均使用
3.8.x
版本的Python。部分文字來自網路,侵刪。
目錄
字典
像列表一樣,字典是許多值的集合。但不像列表的下標,字典的索引可以使用許多不同數據類型,不只是整數。字典的索引被稱為“鍵”,鍵及其關聯的值稱為鍵-值對。
語法格式
dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
例如
myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
將一個字典賦給myCat
變數。這個字典的鍵是'size'
、'color'
和'disposition'
。這些鍵相應的值是'fat'
、'gray'
和'loud'
。可以通過它們的鍵訪問這些值:
>>> myCat['size']
'fat'
字典仍然可以用整數值作為鍵, 就像列表使用整數值作為下標一樣, 但它們不必從0
開始,可以是任何數字。
a = {12: 'fish', 523: 'lion'}
字典與列表的區別
不像列表,字典中的表項是不排序的。但字典中沒有“第一個”表項。雖然確定兩個列表是否相同時,表項的順序很重要,但在字典中,鍵-值對輸入的順序並不重要。
>>> a = ['dog','fish','cat']
>>> b = ['fish','dog','cat']
>>> a == b
False
>>> a={3:'dog',23:'cat',53:'fish'}
>>> b={23:'cat',3:'dog',53:'fish'}
>>> a == b
True
因為字典是不排序的,所以不能像列表那樣切片。嘗試訪問字典中不存在的鍵,將導致KeyError
出錯信息。這很像列表的“越界”IndexError
出錯信息。
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> myCat['age']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'age'
字典的方法
字典的鍵、值和鍵-值對
字典的鍵、值和鍵-值對:keys()
、values()
和items()
。
利用keys()
、values()
和items()
方法,迴圈分別可以迭代鍵、值或鍵-值對。請註意,items()
方法返回的dict_items
值中,包含的是鍵和值的元組。
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> for i in myCat.values():
... print(i)
...
fat
gray
loud
>>> for i in myCat.keys():
... print(i)
...
size
color
disposition
>>> for i in myCat.items():
... print(i)
...
('size', 'fat')
('color', 'gray')
('disposition', 'loud')
通過in
和not in
檢查某個鍵或值是否存在於字典中。
>>> 'name' in myCat.keys()
False
>>> 'size' in myCat.keys()
True
>>> 'gray' in myCat.values()
True
>>> 'gray' not in myCat.values()
False
get()方法
字典有一個get()
方法,它有兩個參數:要取得其值的鍵,以及如果該鍵不存在時,返回的備用值。
a = {'cat': 2,'dog': 5,'fish': 10}
>>> 'I have ' + str(a.get('fish', 0)) + ' fish.'
'I have 10 fish.'
>>> 'I have ' + str(a.get('bird', 0)) + ' birds.'
'I have 0 birds.'
setdefault()方法
setdefault()
方法提供了一種方式,在一行中完成這件事。傳遞給該方法的第一個參數,是要檢查的鍵。第二個參數,是如果該鍵不存在時要設置的值。如果該鍵確實存在,方法就會返回鍵的值。
a = {'cat': 2,'dog': 5,'fish': 10}
>>> a.setdefault('bird',3)
3
>>> a
{'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
>>> a.setdefault('bird',6)
3
>>> a
{'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
常見問題解決方案
字典中的鍵映射多個值
問題
怎樣實現一個鍵對應多個值的字典?
解決方案
如果你想要一個鍵映射多個值,那麼你就需要將這多個值放到另外的容器中, 比如列表或者集合裡面。例如:
d = {
'a' : [1, 2, 3],
'b' : [4, 5]
}
e = {
'a' : {1, 2, 3},
'b' : {4, 5}
}
選擇使用列表還是集合取決於你的實際需求。如果你想保持元素的插入順序就應該使用列表, 如果想去掉重覆元素就使用集合(並且不關心元素的順序問題)。
字典的運算
問題
怎樣在數據字典中執行一些計算操作,比如求最小值、最大值?
以下是蔬菜價格的數據字典:
vegetables = {
'tomato': 3.50,
'potato': 2.32,
'cucumber': 1.75,
'eggplant': 5.15,
'pepper': 8.99
}
找出價格最便宜的蔬菜和最貴的蔬菜。
解決方案
如果你在一個字典上執行普通的數學運算,你會發現它們僅僅作用於鍵,而不是值。比如:
print(min(vegetables)) # Returns 'cucumber'
print(max(vegetables)) # Returns 'tomato'
使用字典的 values()
方法來解決這個問題:
a = min(vegetables.values())
b = max(vegetables.values())
print(f'The lowest price for vegetables is {a}.')
print(f'The highest price for vegetables is {b}.')
輸出結果為:
The lowest price for vegetables is 1.75.
The highest price for vegetables is 8.99.
但不是最終需要得到的結果,最終需要知道最低和最高價格的蔬菜。
zip()
函數方案通過將字典”反轉”為 (值,鍵) 元組序列來解決了上述問題。
a = min(zip(vegetables.values(),vegetables.keys()))
b = max(zip(vegetables.values(),vegetables.keys()))
print(f'The lowest price for vegetables is {a}')
print(f'The highest price for vegetables is {b}')
輸出結果為:
The lowest price for vegetables is (1.75, 'cucumber')
The highest price for vegetables is (8.99, 'pepper')