1. 程式人生 > >Python字典dict

Python字典dict

變量的數據類型 存儲 lse 是否 err 必須 score 順序 tro

dict

Python內置了字典:dict的支持,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。Python中的唯一一種映射類型。

舉個例子,假設要根據同學的名字查找對應的成績,如果用列表(list)實現,需要兩個list:

names = [‘Michael‘, ‘Bob‘, ‘Tracy‘]
scores = [95, 75, 85]

給定一個名字,要查找對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,list越長,耗時越長。

如果用dict實現,只需要一個“名字”-“成績”的對照表,直接根據名字查找成績,無論這個表有多大,查找速度都不會變慢。用Python寫一個dict如下:

>>> d = {‘Michael‘: 95, ‘Bob‘: 75, ‘Tracy‘: 85}
>>> d[‘Michael‘]
95

為什麽dict查找速度這麽快?

  • 因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。
  • 第二種方法是先在字典的索引表裏(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種查找速度都非常快,不會隨著字典大小的增加而變慢。
  • dict就是第二種實現方式,給定一個名字,比如‘Michael‘,dict在內部就可以直接計算出Michael對應的存放成績的“頁碼”,也就是95這個數字存放的內存地址,直接取出來,所以速度非常快。
  • 你可以猜到,這種key-value存儲方式,在放進去的時候,必須根據key算出value的存放位置,這樣,取的時候才能根據key直接拿到value。

dict的key必須是不可變對象

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

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

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

>>> key = [1, 2, 3]
>>> d[key] = ‘a list‘
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: ‘list‘

list與dict


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

  • 查找和插入的速度極快,不會隨著key的增加而變慢;
  • 需要占用大量的內存,內存浪費多。

而list相反:

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

dict的使用


#創建字典 Key:Value 映射類型 Python中的唯一一種映射類型 雙向鏈表

dicts={‘name‘:‘張三‘,‘age‘:12}

#通過Key獲取Value值 通過部首 | 拼音檢索字的操作是一樣的 沒有索引 也沒有下表 元素是無序的

name=dicts.get(‘name‘);
print(name)

#借助for循環 遍歷 字典

for key in dicts:
    print("Keys:%s Values:%s"%(key,dicts.get(key)))
dict=dict(((‘name‘,"張三"),));
print(dict)

#字典的內置方法

#增加元素的方法 同時增加Key和Value

dicts.__setitem__(‘sex‘,‘男‘);

print(dicts)

#刪除元素的方法 通過Key刪除Value

dicts.pop(‘name‘);
print(dicts);

#清空字典元素的方法

dicts.clear();
print(dicts)

#修改字典中元素的值呢 通過Key修改Value

print(dicts[‘age‘])

#修改年齡為歲

dicts[‘age‘]=18;
print(dicts)

#根據Key獲取value的兩種方式: get(key) dicts[key]

#如何分別去遍歷字典中的key和value
#獲取字典中的所有key 返回的類型 (列表|元組) type() 獲取該變量的數據類型 keys 元組(元組中的元素不能被修改)

keys=dicts.keys();
for key in keys:
    print("字典中的Key:%s"%key)

#獲取字典中的所有value 在字典中非常神奇的特性 在字典中Key不能重復 Value可以重復

values=dicts.items();
for item in values:
    print("Keys:%s,Value:%s"%(item[0],item[1]))
dicts.__setitem__(‘age‘,‘男‘)
print(dicts)

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

>>> d[‘Thomas‘]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: ‘Thomas‘

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

>>> ‘Thomas‘ in d
False

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

>>> d.get(‘Thomas‘)
>>> d.get(‘Thomas‘, -1)
-1

註意:返回None的時候Python的交互環境不顯示結果。

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

Python字典dict