python有序字典OrderedDict()


python創建有序字典OrderedDict

# -*- coding:utf-8 -*-
"""
  python有序字典
  需導入模塊collections
"""
import collections
# 通過OrderedDict類創建的字典是有序的
dic = collections.OrderedDict()
dic['k1'] = 'v1'
dic['k2'] = 'v2'
dic['k3'] = 'v3'
print dic
 
"""
    類似通過列表的方式來實現字典有序
    創建列表,添加列表元素k1時,再將k1作為字典的鍵,
    因為列表是序的,所以遍歷列表就可有序的遍歷出字典所有的key
"""
dic = {'K1': 'V1', 'K2': 'V2', 'K3': 'V3'}
li = ['k1', 'k2', 'k3']

參考:

python模塊簡介之有序字典(OrderedDict)

python字典為什么是無序的?

1 Python的Hash實現是基於Open Addressing的。當你搜索所有的key的時候,實際上就是遍歷整個表,尋找那些value不為null的entry,然后把它們的key放到一個list里面,這個 過程自然是不保證順序的。

那本書都寫了啥...(以下用Hash 簡稱 Hash Table)
Hash的思想很簡單, 就是跟 index sorting 一個內核, 申請一個Array, 並將Array的位置作為一種元數據
在 index 排序的時候, 很朴素的, 數值的大小就是 放入array的位置,
舉個例子 我有int A[6], 我要排序 2 5 4 8
將這些數分別放入Array的2 5 4 8位, 然后按順序讀出, 數列就以O(n)的速度排列完了

Hash 和 Index 不同的是,
數值到Array位置的映射是不一樣的, 在Index sorting中, 數值在Array的位置就是數值本身
在Hash中, 是變化的算法, 用Key算出在Array的位置, 放入Value
比如我的Key是10, 在Hash中, 可能會把Value放到Array位置2上

在這種算法下, 插入順序是不可估計的.
第一次操作, Key 2 Value 90 插入到 Hash Table A, 算出來位置是 5
第二次操作, Key 9 Value 10 插入到 Hash Table A, 算出來位置是 3
你發現了沒有, Hash Table根本不保證插入的順序
后來的數據是可以跑到先插入的數據前面去的.

Hash的本質是, 將一數列作為Key盡量平均分配另一個數列Value到程序已經申請好的Array上.

最后說點無關的, 也會導致字典亂序的原因.
Python會自動擴容字典.
 
作者:林誠
鏈接:https://www.zhihu.com/question/24306558/answer/27358613
來源:知乎

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM