python中dict和list的資料結構

2022-07-22 11:54:12 字數 1310 閱讀 3096

要理解dict的有關內容需要你理解雜湊表(map)的相關基礎知識,這個其實是《演算法與資料結構》裡面的內容。

1.list和tuple其實是用鍊錶順序儲存的,也就是前乙個元素中儲存了下乙個元素的位置,這樣只要找到第乙個元素的位置就可以順藤摸瓜找到所有元素的位置,所以list的名字其實就是個指標,指向list的第乙個元素的位置。list的插入和刪除等可以直接用鍊錶的方式進行,比如我要在第1個元素和第2個元素中間插入乙個元素,那麼直接在鍊錶的最後面(我們假設這個list只有兩個元素,那麼也就是在第3個元素的位置上)插入這個元素,然後把第乙個元素指標指向這個元素(第3個位置),然後再把新插入的元素的指標指向原來的第2個元素,這樣插入操作就完成了。讀取這個list的時候,先用list的名字(就是個指標,指向第1個元素的位置)找到第乙個元素,然後用第1乙個元素的指標找到第2個元素(位置3),然後用第2個元素的指標找到第3個元素(位置2),以此類推。所以list的順序和記憶體中的實際順序其實不一定完全對應。這種儲存方式不會浪費記憶體,但查詢起來特別費時間,因為要按照鍊錶乙個乙個找下去,如果你的list特別大的話,那麼要等好久才會找到結果。

2.dict則為了快速查詢使用了一種特別的方法,雜湊表。雜湊表採用雜湊函式從key計算得到乙個數字(雜湊函式有個特點:對於不同的key,有很大的概率得到的雜湊值也不同),然後直接把value儲存到這個數字所對應的位址上,比如key='abc',value=10,經過雜湊函式得到key對應的雜湊值為123,那麼就申請乙個有1000個位址(從0到999)的記憶體,然後把10存放在位址為123的地方。類似的,對於key='bcd',value=20,得到key的雜湊值為234,那麼就把20存放在位址為234的地方。對於這樣的表查詢起來是非常方便的。只要給出key,計算得到雜湊值,然後直接到對應的位址去找value就可以了。無論有幾個元素,都可以直接找到value,無需遍歷整個表。不過雖然dict查詢速度快,但記憶體浪費嚴重,你看我們只儲存了兩個元素,都要申請乙個長度為1000的記憶體。

3.現在你知道為啥key要用不可變物件了吧?因為不可變物件是常量,每次的雜湊值算出來都是固定的,這樣就不會出錯。比如key='abc',value=10,儲存位址為123,假設我突發奇想,把key改成'bcd',那麼當查詢'bcd'的value的時候就會去234的位址找,但那裡啥也沒有,這就亂套了。

3.你看我們上面有一句話:對於不同的key,有很大的概率得到的雜湊值也不同。那麼有很小的概率不同的key可以得到相同的雜湊值了?沒錯,比如對於我們的例子來說,雜湊值只有3位,那麼只要元素個數超過1000,就一定會有至少兩個key的雜湊值相同(鴿籠原理),這種情況叫「衝突」,設計雜湊表的時候要採取辦法減少衝突,實在衝突了也要想辦法補救。不過這是編譯器的事情,況且對於初學者的我們來說碰到的衝突的概率基本等於零,就不用操心了。

python中dict和list排序

1 list排序 列表的排序是python內建功能,自身含有sort方法 如 s 2,1,3,0 s.sort 0,1,2,3 2 dict排序 對字典的排序,因為每乙個項包括乙個鍵值對,所以要選擇可比較的鍵或值進行排序 sorted iterable cmp key reverse cmp和key...

python中dict和lambda結合的小例子

python的dict用起來很方便,可以自定義key值,並通過下標訪問,示例如下 d print d key2 value2 lambda表示式也是很實用的東東,示例如下 f lambda x x 2 print f 2 4 兩者結合可以實現結構相似的函式呼叫,使用起來很方便,示例如下 示例一 不帶...

Python中的json和dict轉換

一 json和dict python中的dict型別和json格式互相轉換,需要用到json庫 import json 字典轉化成json json.dumps dict json轉化成字典 dict json.loads 二 轉換 1 例項 python中並沒有json型別這一說法,通過json....