本篇主要介紹:常見的字典方法、如何處理查不到的鍵、標準庫中 dict 類型的變種、散列表的工作原理等。一下是全部內容:
泛映射類型
collections.abc 模塊中有 Mapping 和 MutableMapping 這兩個抽象基類,它們的作用是為 dict 和其他類似的類型定義形式接口。

標準庫里所有映射類型都是利用 dict 來實現的,它們有個共同的限制,即只有可散列的數據類型才能用做這些映射里的鍵。
問題: 什么是可散列的數據類型?
在 python 詞匯表(https://docs.python.org/3/glossary.html#term-hashable)中,關于可散列類型的定義是這樣的:
如果一個對象是可散列的,那么在這個對象的生命周期中,它的散列值是不變的,而且這個對象需要實現 __hash__() 方法。另外可散列對象還要有 __eq__() 方法,這樣才能跟其他鍵做比較。如果兩個可散列對象是相等的,那么它們的散列只一定是一樣的
根據這個定義,原子不可變類型(str,bytes和數值類型)都是可散列類型,frozenset 也是可散列的(因為根據其定義,frozenset 里只能容納可散列類型),如果元組內都是可散列類型的話,元組也是可散列的(元組雖然是不可變類型,但如果它里面的元素是可變類型,這種元組也不能被認為是不可變的)。
一般來講,用戶自定義的類型的對象都是可散列的,散列值就是它們的 id() 函數的返回值,所以這些對象在比較的時候都是不相等的。(如果一個對象實現了 eq 方法,并且在方法中用到了這個對象的內部狀態的話,那么只有當所有這些內部狀態都是不可變的情況下,這個對象才是可散列的。)
根據這些定義,字典提供了很多種構造方法,https://docs.python.org/3/library/stdtypes.html#mapping-types-dict 這個頁面有個例子來說明創建字典的不同方式。
>>> a = dict(one=1, two=2, three=3)>>> b = {'one': 1, 'two': 2, 'three': 3}>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))>>> d = dict([('two', 2), ('one', 1), ('three', 3)])>>> e = dict({'three': 3, 'one': 1, 'two': 2})>>> a == b == c == d == eTrue除了這些方法以外,還可以用字典推導的方式來建造新 dict。
字典推導
自 Python2.7 以來,列表推導和生成器表達式的概念就移植到了字典上,從而有了字典推導。字典推導(dictcomp)可以從任何以鍵值對作為元素的可迭代對象中構建出字典。
比如:
>>> data = [(1, 'a'), (2, 'b'), (3, 'c')]>>> data_dict = {num: letter for num, letter in data}>>> data_dict{1: 'a', 2: 'b', 3: 'c'}
新聞熱點
疑難解答