python基礎教程:dict(字典)
字典(dict, dictionary的簡寫)是Python中另一個非常重要的內建資料型別,是Python中對映型別(Mapping Type),它把“鍵”(key)對映到“值”(value),通過key可以快速找到value,它是一種“鍵值對”(key-value)資料結構。

“鍵”,可以是任意不可變的型別物件(可以做hash,即具有 hash() 和 eq ()方法的物件),通常是字串和數字,同一個字典中鍵是唯一的。但不能是list,因為list可以通過索引、切片、append()和extend()方法改變其值。
“值”,可以是任何型別的資料。

Python字典(dict)的建立
字典可以通過 dict()
或一對花括號建立一個空字典: d = {}
。花括號內可以放用逗號 ,
隔開的多個鍵值對,鍵值對用冒號 :
隔開:
In [1]: d1 = {} In [2]: d2 = dict() In [3]: d1 == d2 Out[3]: True In [4]: d3 = {'a': 1, 'b': 2, 'c': 3} In [5]: d3 Out[5]: {'a': 1, 'b': 2, 'c': 3} In [6]: d4 = {'a': 1, 'a':2, 'a':3} In [7]: d4 Out[7]: {'a': 3}
上面最後一個例子d4的初始化中,鍵都是 'a'
,所以得到的字典只有一個鍵,它的值是最後一次賦值 3
.
dict()建立字典物件
dict()無引數時生成空字典,也可以通過傳入引數進行初始化。傳入引數有兩種形式:
一種是,序列型資料list或tuple,它每個元素必須又含有兩個子元素,以滿足key-value對;
一種是,name=value形式的引數。
見下面的例子:
In [21]: d1 Out[21]: {'a': 1, 'b': 2, 'c': 3} In [22]: d2 = dict(a=1, b=2, c=3) In [23]: d2 Out[23]: {'a': 1, 'b': 2, 'c': 3}
字典推導式(Dict Comprehension)
類似列表推導式,我們可以通過一個for迴圈表示式來建立一個字典:
In [10]: dd = {x: x*x for x in range(5)} In [11]: dd Out[11]: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
list不能做字典的key,但是可以做value:
In [12]: l1 = [1,2,3] In [13]: d = {'a': l1} In [14]: d = {l1: 'a'} ---------------------- TypeErrorTraceback (most recent call last) <ipython-input-14-bcd280c2bff6> in <module> ----> 1 d = {l1: 'a'} TypeError: unhashable type: 'list'
Python字典(dict)的訪問
(1)通過鍵訪問其值
列表可以通過其索引訪問元素,字典就是通過鍵訪問對應的值,形式類似列表那樣用方括號,只不過用“鍵”替代了“索引”。方法是字典物件名稱加方括號括起來的鍵名,比如: mydict['a']
。如果某個鍵不在字典物件中,通過方括號訪問就會報錯:
In [26]: myd = dict(a=1, b=2, c=3) In [27]: myd Out[27]: {'a': 1, 'b': 2, 'c': 3} In [28]: myd['a'] Out[28]: 1 In [29]: myd['e'] ------------------ KeyErrorTraceback (most recent call last) <ipython-input-29-86b81ed4647a> in <module> ----> 1 myd['e'] KeyError: 'e'
(2)通過get(key)方法訪問其值
給get()傳入鍵作為引數,就可以得到value,如果key不存在則返回None。
In [30]: myd.get('a') Out[30]: 1 In [31]: print(myd.get('e')) None
Python字典(dict)的更改
詳見下面的示例程式碼:
In [32]: myd = dict(a=1, b=2, c=3) In [33]: myd['a'] = 9# 改變某個鍵的值 In [34]: myd Out[34]: {'a': 9, 'b': 2, 'c': 3} In [35]: myd['e'] = 8# 增加新的鍵值對 In [36]: myd Out[36]: {'a': 9, 'b': 2, 'c': 3, 'e': 8} In [37]: del myd['e']# 刪除某個鍵及其值 In [38]: myd Out[38]: {'a': 9, 'b': 2, 'c': 3} In [39]: myd.pop('c')# 刪除某個鍵及其值並得到其值 Out[39]: 3 In [40]: myd Out[40]: {'a': 9, 'b': 2}
Python字典(dict)相關的內建函式
Python內建了一些函式可以用於操作字典,它們是:
-
len()
返回字典的長度,是鍵的個數,也是值的個數,也是鍵值對的個數。空字典的長度是0
In [41]: len({'a':1, 'b':2}) Out[41]: 2 In [42]: len({}) Out[42]: 0
-
any()和all()
類似於對列表、tuple的操作,不過這兩個函式檢驗的是字典的鍵(key)。
any(): 只要字典有一個鍵為True則返回True;
all(): 只有字典的所有鍵都為True才返回True;
In [45]: any({'': 1, 0: 'abcd', False: 333}) Out[45]: False In [46]: all({'': 1, 0: 'abcd', False: 333}) Out[46]: False In [47]: all({'a': 1, 0: 'abcd', False: 333}) Out[47]: False In [48]: any({'a': 1, 0: 'abcd', False: 333}) Out[48]: True In [49]: any({}) Out[49]: False In [50]: all({}) Out[50]: True
不過,空字典有意思,它沒有鍵卻認為是所有鍵都為True, all({})
返回True。
-
sorted()
跟操作列表、tuple的效果一樣,它把字典的所有key當做一個列表(或元組)進行排序
In [51]: sorted({'a': 1, 'c': 3, 'b': 4}) Out[51]: ['a', 'b', 'c']
in 運算子
跟列表,元組一樣, in
用來檢驗一個key是不是在字典中:
In [56]: 'a' in {'a': 1, 'c': 3, 'b': 4} Out[56]: True In [57]: '3' in {'a': 1, 'c': 3, 'b': 4} Out[57]: False In [58]: '3' not in {'a': 1, 'c': 3, 'b': 4} Out[58]: True
遍歷字典:
In [59]: for key in {'a': 1, 'c': 3, 'b': 4}: ...:print(key) ...: a c b
Python字典(dict)的內建方法:
(1)keys()
返回鍵(key)的view物件(型別是:dict_keys)。這個view物件可以動態檢視字典內部的物件,當字典改變後,這個view物件也會反應變化。
Python 2時,返回的是list,現在是dict_keys。
In [76]: myd = dict(a=1, b=2, c=3) In [77]: kk = myd.keys() In [78]: type(kk) Out[78]: dict_keys In [79]: for k in kk: ...:print(k) ...: a b c In [80]: myd['e'] = 9# 修改了字典 In [81]: for k in kk:# 並沒有重新獲取kk,但是kk已經反應了變化,多了e ...:print(k) ...: a b c e
(2)values()
返回值(value)的view物件,dict_values。
(3)items()
返回鍵值對(key-value)的view物件:dict_items
In [82]: vv = myd.values() In [83]: vv Out[83]: dict_values([1, 2, 3, 9]) In [84]: ii = myd.items() In [85]: ii Out[85]: dict_items([('a', 1), ('b', 2), ('c', 3), ('e', 9)])
(4)get(key)
獲取key對應的value,上面已經講到。
(5)clear()
清空一個字典
In [86]: myd.get('a') Out[86]: 1 In [87]: myd.get('x', 0) Out[87]: 0 In [88]: myd.clear() In [89]: myd Out[89]: {}
(6)copy()
在Python中,把列表,字典物件賦值給變數時,都是“淺拷貝”,即,變數指向了物件,原來的物件改變了,這個變數的值也會跟著變。而cop()函式是“深拷貝”,重新創造一個新物件賦值給變數,原來的物件的改變不影響新物件。
In [94]: d1 = {'a':1} In [95]: d2 = d1# 淺拷貝 In [96]: d3 = d1.copy()# 深拷貝 In [97]: d1['a'] = 2# 改變原來的字典 In [98]: d2 Out[98]: {'a': 2}# 淺拷貝的d2也跟著改變 In [99]: d3 Out[99]: {'a': 1}# 深拷貝的d3還是原來的值
(7)pop(key)
刪除key並返回它的值,上面已經講到。
(8)popitem()
返回一對鍵值:
In [105]: myd = dict(a=1, b=2, c=3) In [106]: myd.popitem() Out[106]: ('c', 3) In [107]: myd.popitem() Out[107]: ('b', 2)
(9)fromkeys()
通過一個序列來初始化字典:
In [109]: d = {} In [110]: d.fromkeys([1,2,3]) Out[110]: {1: None, 2: None, 3: None} In [111]: d.fromkeys([1,2,3], 0) Out[111]: {1: 0, 2: 0, 3: 0}
(10)update()
用一個字典來更新另一字典:
In [113]: d = d.fromkeys([1,2,3], 0) In [114]: d Out[114]: {1: 0, 2: 0, 3: 0} In [115]: d.update({1:10, 2:20}) In [116]: d Out[116]: {1: 10, 2: 20, 3: 0}
總結
字典是Python中很重要的一個數據結構,也是Python內建的資料型別。今後的程式設計中會經常用到它,所以要熟練掌握它的各種操作。
大家在學python的時候肯定會遇到很多難題,以及對於新技術的追求,這裡推薦一下我們的Python學習扣qun:784758214,這裡是python學習者聚集地!!同時,自己是一名高階python開發工程師,從基礎的python指令碼到web開發、爬蟲、django、資料探勘等,零基礎到專案實戰的資料都有整理。送給每一位python的小夥伴!每日分享一些學習的方法和需要注意的小細節
