天天看點

【Python入門】Python的Dict容器二

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)      
【Python入門】Python的Dict容器二

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))      
【Python入門】Python的Dict容器二

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)      
【Python入門】Python的Dict容器二

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))