python用雜湊表來實現字典,雜湊表就是稀疏陣列(陣列中有空白元素),雜湊表中的元素叫做表元,字典的每個鍵值對都占用乙個表元,乙個表元分成兩個部分,乙個是對鍵的應用,另乙個是對值的引用,因為表元的大小一致,所以可以通過稀疏陣列(雜湊表)的偏移量讀取指定的表元
python會保證雜湊表中三分之一的表元都是空的,當向字典中新增元素時,雜湊表就會用鍵值對填充表元,當達到剩餘三分之一表元是空的時,會將當前的雜湊表放到乙個更大的空間中
當通過key獲取字典的value時(求取dict[key]),過程如下:
1.呼叫hash(key)求取key的雜湊值。
2.把雜湊值的低幾位當做偏移量,查詢雜湊表裡對應的表元。
3.如果表元為空,丟擲異常(keyerror),如果表元不為空,會找到一對foundkey:foundvalue。
4.如果foundkey與key相等,返回foundvalue,如果foundkey與key不相等,發生雜湊衝突,執行第5步。
5.演算法在雜湊值中再取幾位,通過新的雜湊值計算索引,再查詢對應的表元,然後執行3和4。
上述過程的流程圖如下:
新增元素和更新值的過程和上述流程基本一致,新增元素時,如果發現是空表元,會直接新增值,更新值時,找到對應的表元後,原表元里的值會被更新為新值。
雜湊衝突並不會總發生,所以字典的速度很快。
因為字典通過key查詢value是通過hash函式計算雜湊值,所以字典的key必須支援hash函式,且通過hash函式計算出的雜湊值是唯一的,所以key可以使用字串(str),整型(int),元祖(tuple),但是不能是list
因為雜湊表是稀疏的,所以字典所佔記憶體極高,典型的空間換時間
因為當向字典中新增鍵值對時,可能會發生雜湊衝突,導致鍵值對的出現在字典中的順序不同,比如,新增乙個key和value,如果沒有發生雜湊衝突,那麼該鍵值對出現在字典中的位置可能靠前,如果發生了雜湊衝突,就有可能出現在字典中靠後的位置,所以鍵值對在字典中的位置完全取決於新增順序
舉例
l=[(2,'two'), (1,'one'), (4,'four'), (3,'three')]
d1=dict(l);
print(d1.keys(), d1.items())
d2=dict(sorted(l));#按照key排序
print(d2.keys(),d2.items())
d3=dict(sorted(l, key =lambda x : x[1]))#按照value排序
可見,雖然python都認為上述三個字典是相等的,但是鍵值對在字典中的順序完全不同
因為向字典中新增新的鍵值對時,有可能導致字典內部的雜湊表重新分配記憶體,當把字典中的元素重新新增到新的記憶體中時,可能導致雜湊衝突,從而導致鍵值對在字典中的位置發生變化
這樣在迴圈迭代並同時新增鍵值對時就有可能跳過一些鍵
所以,在對已有字典進行迴圈迭代時,不要同時進行新增操作,而應該先新建乙個空字典,將要新增的鍵值對放在空字典中,然後對原有字典和新字典進行合併
合併字典可用update方法
編碼就是將文字字串轉化為位元組序列,解碼就是將位元組序列轉化為文字字串,常見的編譯碼格式有utf8,位元組序列計算機識別,文字字串人類識別
舉例
s1='helloworld'
參考1.《流暢的python》
2.
Python自娛 8 字典
字典是可變資料型別 字典是python中唯一對映資料型別 字典的特點是查詢效率高 儲存大量的關係型資料 通過key查詢value,內部使用key來計算乙個記憶體位址 key是不可變資料型別 元組 bool int str python3.5以前字典是無序的 7.建立字典的幾種方式以及zip用法 in...
DAY8 字典與集合
no.6 字典與集合 一 字典 對映型別 1 語法 dict e.g.dict1 print 李寧的口號是 dict1 李寧 李寧的口號是 一切皆有可能 e.g.dict2 dict 高爾基 海燕啊海燕 戴望舒 丁香一樣的結著愁怨的姑娘 dict2 若要給字典新增一對鍵 key 與值 value 則...
Swift學習 8 字典
字典是一種儲存多個相同型別的值的容器。每個值 value 都關聯唯一的鍵 key 鍵作為字典中的這個值資料的識別符號。和陣列中的資料項不同,字典中的資料項並沒有具體順序。var games string string diablo3 2014 8 12 dragon age 2014 10 07 v...