字典的本質就是hash表,hash表就是通過 key 找到其value,平均情況下你只需要花費 o(1) 的時間複雜度即可以完成對乙個元素的查詢,字典是否有序,並不是指字典能否按照鍵或者值進行排序,而是字典能否按照插入鍵值的順序輸出對應的鍵值。
比如,對於乙個無序字典,插入順序和遍歷的順序是不一致的:
>>> my_dict = dict()
>>> my_dict["name"] = "lowman"
>>> my_dict["age"] = 26
>>> my_dict["girl"] = "tailand"
>>> my_dict["money"] = 80sonifejs
>>> my_dict["hourse"] = none
>>> for key,value in my_dict.items():
... print(key,value)
...money 80
girl tailand
age 26
hourse none
name lowman
而乙個有序字典的輸出是這樣的:
name lowman
age 26
girl tailand
money 80
hourse none
那為什麼 python3.6 之後,python 的字典就有序了呢?
先從 python3.6 之前說起。在 python 3.6 之前,其資料結構如下圖所示:
由於不同鍵的雜湊值不一樣,雜湊表(entries)中的順序是按照雜湊值大小排序的,遍歷時從前往後遍歷並不能輸出鍵值插入的順序,其表現起來就是無序的。
此外,這種方式還有乙個缺程式設計客棧點,就是如果以稀疏的雜湊表儲存時,會浪費較多的記憶體空間,python3.6之後,對其進行了優化,雜湊索引和真正的鍵值對分開存放,資料結構如下所示:
indices指向了一列索引,entries指向了原本的儲存雜湊表內容的結構。
你可以把 程式設計客棧indice理解成新的簡化版的雜湊表,entries理解成乙個陣列,陣列中的每個元素是原本應該儲存的雜湊結果:鍵和值。
查詢或者插入乙個元素的時候,程式設計客棧根據鍵的雜湊值結果取模indices的長度,就能得到對應的陣列下標,再根據對應的陣列下標到entries中獲取到對應的結果,比如 hash("key2") % 8 的結果是 3,那麼 indices[3] 的值是 1,這時候到 entries 中找到對應的 entries[1] 既為所求的結果:
這麼做的好處是空間利用率得到了較大的提公升,我們以 64 位作業系統為例,每個指標的長度為 8 位元組,則原本需要 8 * 3 * 8 為 192
現在變成了 8 * 3 * 3 + 1 * 8 為 80,節省了 58% 左右的記憶體空間,如下圖所示:
此外,由於entries是按照插入順序進行插入的陣列,對字典進行遍歷時能按照插入順序進行遍歷,這也是為什麼 python3.6 以後的版本字典物件是有序的原因。
最後:
python3 6 爬蟲例子
importurllib.request importre importos importurllib.erroraserror url 請求 request urllib.request.request url 爬取結果 response urllib.request.urlopen reques...
Mac 解除安裝Python3 6
mac 自帶的 python 已經能夠滿足我們的需要了,因此很多同學在安裝完 python 之後,又想要將其刪除,或者稱之為解除安裝。對於刪除 python,我們首先要知道其具體都安裝了什麼,實際上,在安裝 python 時,其自動生成 1 python framework,即 python 框架 ...
Python 3 6安裝教程
目前,python有兩個版本,乙個是2.x版,乙個是3.x版,這兩個版本是不相容的。本教程安裝的是python 3.6.1 amd64版本。python官網 特別要注意勾上add python 3.6 to path,然後點 install now 即可完成安裝。則代表安裝成功!python不是內部...