Python的Dict容器二
- 7. Python的Dict容器
- 7.4 Python更新dict元素
- 7.5 Python删除dict元素
- 7.6 Python dict的特點
- 7.7 Python操作dict的其他方法
7. Python的Dict容器
7.4 Python更新dict元素
我們學習了往dict中添加元素的方法,通過指派語句就可以把元素添加到dict中去,但是指派的時候,我們并不确定key是否已經在dict裡面了,如果dict裡面已經有對應的key了,那将會發生什麼呢?
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
d['Bob'] = 75
print(d)
# ==> {'Alice': 45, 'Bob': 75, 'Candy': 75, 'David': 86, 'Ellena': 49}
這個時候我們發現,原來Bob的成績是60,現在變成75了,因為d[‘Bob’] = 75的緣故。
是以我們發現這個指派語句其實有兩個功能:
- 當key不存在時,往dict中添加對應的key: value元素。
-
當key存在時,會更新dict,用新的value替換原來的value。
是以,在使用指派語句往dict中添加元素時,為了避免不必要的覆寫問題,我們需要先判斷key是否存在,然後再做更新
示例
已有同學們的成績如下,請更新Alice的成績為60,并把舊的成績記錄下來
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
# Enter a code
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
old_score = d.get('Alice')
d['Alice'] = 60
print(old_score)
7.5 Python删除dict元素
dict提供便捷的pop()方法,允許我們快速删除元素,pop()方法需要指定需要删除的元素的key,并傳回對應的value。
假設Alice轉校了,需要把Alice的成績删除,可以這樣寫:
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
print(d) # ==> {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
alice_score= d.pop('Alice')
print(alice_score) # ==> 45
print(d) # ==> {'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
需要注意的是,pop()方法的參數是dict中的key,當key不存在時,同樣會引起錯誤。比如在上述操作中,已經把Alice的成績删除了,假如再次pop(‘Alice’),将會引發錯誤。
d.pop('Alice')
# 報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Alice'
示例
在dict中,使用keys()方法,可以傳回dict的所有key,在删除某個元素時,可以通過這個方法先判斷某個元素是否存在,請改造前面的程式,使得即使key不存在時,删除也不會抛異常
# Enter a code
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
name = 'Alice'
if name in d.keys():
d.pop(name)
else:
print('{} not in d'.format(name))
7.6 Python dict的特點
- 查找速度快
dict的第一個特點是查找速度快,無論dict有10個元素還是10萬個元素,查找速度都一樣。而list的查找速度随着元素增加而逐漸下降
不過dict的查找速度快不是沒有代價的,dict的缺點是占用記憶體大,還會浪費很多内容,list正好相反,占用記憶體小,但是查找速度慢
- 有序與無序
在Python3.5之前,dict中的元素是無序的,也就是dict中元素的插入順序和列印順序未必一緻,比如使用Python3.5之前的版本執行以下代碼:
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
print(d) # ==> {'Bob': 60, 'Ellena': 49, 'Alice': 45, 'Candy': 75, 'David': 86}
可以看到,列印的順序和定義的順序并不一緻。
但是在Python3.6、Python3.7版本中,卻得到了有序的結果
print(d) # ==> {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
為什麼在不同的版本中,會得到不一樣的結果呢?這是因為底層的實作發生了改變,我們可以認為在Python3.6的版本以後,dict是有序的,但是一般而言,為了避免不必要的誤解,一般在需要有序的dict時,我們會使用一種叫做Ordereddict的字典,來確定有序
- key不可變
對于基礎資料類型,字元串、數字等,這些都是不可變的,可以作為dict的key,而對于複雜資料類型,經過前面的學習,我們知道tuple是不可變的,list是可變的,是以tuple可以作為dict的key,但是list不可以作為dict的key,否則将會報錯
key = (1, 2, 3) # 以tuple作為key
d[key] = True
key = [1, 2, 3]
d[key] = True
# 報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
如上所示,如果将list作為dict的key,将會引起錯誤
由于dict是按 key 查找,是以,在一個dict中,key不能重複
- Python周遊dict
通過直接print(d),我們列印出來的是完整的一個dict;有時候,我們需要把dict中m一定條件的元素列印出來,比如成績超過60的,在這種情況下,我們需要則需要周遊dict(這種時候需要使用for循環),并通過條件判斷把滿足條件的列印出來。
周遊dict有兩種方法:
第一種是周遊dict的所有key,并通過key獲得對應的value。
d = {
'Alice': 45,
'Bob': 60,
'Candy': 75,
'David': 86,
'Ellena': 49
}
for key in d: # 周遊d的key
value = d[key]
if value > 60:
print(key, value)
# ==> Candy 75
# ==> David 86
第二種方法是通過dict提供的items()方法,items()方法會傳回dict中所有的元素,每個元素包含key和value
for key, value in d.items():
if value > 60:
print(key, value)
# ==> Candy 75
# ==> David 86
示例
同學的近三次成績如下,請把每個同學的每次成績依次輸出
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
# Enter a code
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
for key, value in d.items():
for score in value:
print(key, score)
7.7 Python操作dict的其他方法
除了前面學習的增删改查,dict還提供了非常多的工具函數幫助我們友善快捷的使用dict
- 擷取dict的所有key
dict提供keys()函數,可以傳回dict中所有的key。
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
for key in d.keys():
print(key)
# ==> Alice
# ==> Bob
# ==> Candy
- 擷取dict所有的value
dict提供values()函數,可以傳回dict中所有的value
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
for key in d.values():
print(key)
# ==> [50, 61, 66]
# ==> [80, 61, 66]
# ==> [88, 75, 90]
- 清除所有元素
dict提供clear()函數,可以直接清除dict中所有的元素
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
print(d) # ==> {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
d.clear()
print(d) # ==> {}
示例
# Enter a code
d = {'Alice': [50, 61, 66], 'Bob': [80, 61, 66], 'Candy': [88, 75, 90]}
keys = d.keys()
print(len(keys))