dict & set

新建 dict:

新建 dict (無序)

字典推導(dǎo):

字典推導(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ù)格式的主流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容