小白學python系列-(8)dict

宋寶康發表於2018-04-06

dict

Python內建了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)儲存,具有極快的查詢速度。

舉個例子,假設要根據同學的名字查詢對應的成績,用dict實現,只需要一個“名字”-“成績”的對照表,直接根據名字查詢成績,如下:

student_scores = {'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
print(student_scores)
print('銅須3的成績:'+str(student_scores['銅須3']))
複製程式碼
{'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
銅須3的成績:90
複製程式碼

這種key-value儲存方式,在放進去的時候,必須根據key算出value的存放位置,這樣,取的時候才能根據key直接拿到value。

賦值

把資料放入dict的方法,除了初始化時指定外,還可以通過key放入:

student_scores = {'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
print('銅須3的成績:'+str(student_scores['銅須3']))
student_scores['銅須3']= 66
print('銅須3修改後的成績:'+str(student_scores['銅須3']))
複製程式碼
銅須3的成績:90
銅須3修改後的成績:66
複製程式碼

如果key不存在,dict就會報錯:

student_scores = {'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
print('銅須13的成績:'+str(student_scores['銅須13']))
複製程式碼
Traceback (most recent call last):
  File "/Users/Song/PycharmProjects/test/text.py", line 2, in <module>
    print('銅須13的成績:'+str(student_scores['銅須13']))
KeyError: '銅須13'
複製程式碼

要避免key不存在的錯誤,有兩種辦法
一是通過in判斷key是否存在:

student_scores = {'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
if '銅須13'in student_scores:
    print('銅須13的成績:'+str(student_scores['銅須13']))
else:
    print("沒查到該同學")

複製程式碼
沒查到該同學
複製程式碼

二是通過dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

student_scores = {'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
scores = student_scores.get('銅須13', -1)
if scores > 0:
    print('銅須13的成績:'+str())
else:
    print('成績資料錯誤')
複製程式碼
成績資料錯誤
複製程式碼

刪除

要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除:

student_scores = {'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
print(student_scores)
student_scores.pop('銅須3')
print(student_scores)
複製程式碼
{'同學2': 78, '銅須3': 90, '銅須4': 60, '銅須6': 44}
{'同學2': 78, '銅須4': 60, '銅須6': 44}
複製程式碼

請務必注意,dict內部存放的順序和key放入的順序是沒有關係的。

和list比較,dict有以下幾個特點:

  • 查詢和插入的速度極快,不會隨著key的增加而變慢;
  • 需要佔用大量的記憶體,記憶體浪費多。

而list相反:

  • 查詢和插入的時間隨著元素的增加而增加;
  • 佔用空間小,浪費記憶體很少。 所以,dict是用空間來換取時間的一種方法。

dict可以用在需要高速查詢的很多地方,在Python程式碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變物件。

這是因為dict根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為雜湊演算法(Hash)。

要保證hash的正確性,作為key的物件就不能變。在Python中,字串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key:

相關文章