新建 dict:

字典推導(dǎo):

常見方法
-
fromkeys(iter, [initial])
fromkeys -
items()、keys()、values()
items、keys、values -
iter(d)
iter
- get(k, [default])、pop(k, [default])
- popitem() 隨機返回一個鍵值對并刪除它,對于 OrderedDict 先進先出,故先刪最先插入的元素,其中有個可選參數(shù) last 默認 False,設(shè)為 True 則是后進先出
- _getitem_(k) 是 d[k] 的背后。對于 defaultdict ,找不到對應(yīng)鍵時調(diào)用 _missing_(k),_missing_中又會調(diào)用 default_factory(可調(diào)用對象) 對未找到的鍵設(shè)置值
- _setitem_(k, v) 是 d[k] = v 的背后
- setdefault(k, [default]) 若 k 不存在,相當(dāng) setitem 返回 default,若 k 存在,則返回 k 對應(yīng)的值
- update(m, [**kwarg]) m 可以是映射或鍵值對迭代器。鴨子類型,只有 m 有方法 keys,就可看作映射
- setdefault
my_dict.setdefault(key, []).append(new_value) # 只有一次鍵查詢
if key not in my_dict: # 第一次查詢
my_dict[key] = [] # 可能又一次查詢
my_dict[key].append(new_value) # 又一次查詢
dict 變種
-
defaultdict
新建 dd = defaultdict(list),當(dāng) new_key不存在時,表達式 dd['new_key'] 執(zhí)行如下:
調(diào)用 list(),生成一個新列表,作為鍵 new_key 的值,返回這個列表的引用
這里 list 為一個可調(diào)用對象,稱為 default_factory
defaullt_factory -
OrderedDict
OrderedDict -
Counter
Counter - UserDict
- 這個類用純 Python 把標準 dict 又實現(xiàn)了一遍
- 這個類有一個 data 屬性,是 dict 實例,也是 UserDict 存放數(shù)據(jù)的地方
-
MappingProxyType
只讀的映射視圖,但是它是動態(tài)的,即對原映射修改,可以通過這個映射視圖實時觀察
MappingProxyType
set
set 不可散列,frozenset 可散列。set 中元素要求可散列。
基于散列表,極快的查找速度,對 in 運算符優(yōu)化
中綴運算符:|并、&交、-差
字典的散列表
散列表是一個稀疏數(shù)組(總有一些空白元素稱為稀疏)
散列表單元稱為表元(bucket),存放鍵和值的引用
Python 保證 1/3 表元是空的,快到這個閾值時散列表將會被復(fù)制到更大空間
要把一個對象放入散列表,首先要計算這個對象的散列值,即哈希值 hash()
CPython 一條實現(xiàn)細則:一個整型對象能被存入一個機器字中,那么它的散列值就是它本身
為讓散列值能充當(dāng)索引這角色,散列值之間應(yīng)盡量分散開,即越是相似不等的對象,散列值相差越大
如果兩個對象用 == 比較相等的,那么它們的散列值也應(yīng)相等
散列表算法

dict 的實現(xiàn)及其特點
- 鍵必須可散列
可散列對象要求:
(1)支持 hash(),且 _hash_() 得到的值不變
(2)支持 _eq_()
(3)若 a == b為真,則 hash(a) == hash(b) 也為真 - dict 內(nèi)存開銷大
散列表是稀疏的,導(dǎo)致內(nèi)存開銷巨大 - 鍵查詢很快
-
鍵的次序取決于添加順序
包含的數(shù)據(jù)一樣,字典相等
鍵的次序取決于添加順序 - 往字典中添加新鍵可能改變已有鍵順序
添加新鍵、字典擴容、散列沖突、鍵順序改變
一個小技巧
不要迭代字典的同時又對字典進行修改,這樣可能跳過一些鍵
應(yīng)該迭代的同時,得出要修改的內(nèi)容添加到新字典中,迭代后才修改
set 的實現(xiàn)及其特點
set 與 frozenset 都依賴于散列表,特點與 dict 類似
(1)散列表里存放的是元素的引用,就像字典里存放的只有鍵,散列表才存放值的引用
(2)set 元素必須可散列
(3)in 運算符很高效
(4)很耗內(nèi)存
(5)元素次序取決于添加次序
(6)往 set 中添加新元素可能改變原有元素次序
雜談
dict 優(yōu)化目標:更好的實現(xiàn)對隨機鍵的讀取
JSON:瘦身版XML,從 JavaScript 發(fā)展而來,而 JavaScript 從 Python 里偷師使用了:(字面量句法),故除了 true、false、null 這幾個值拼寫有出入之外,其余 JSON 與 Python 是完全兼容的。dict 和 list 使 JSON 成為交換數(shù)據(jù)格式的主流。







