根據我所知,您不能假定數據結構(如字典)將按照您初始化的順序保存其中的值。 例如:Python數據結構順序
d = {1:10,2:20,3:30}
當您打印這裏面一個for循環,其結果可能是:
{2:20,1:10,3:30}
爲什麼會發生 - 爲什麼詞典(或其他數據結構)將不會保留按特定順序的值? 僅僅對字典纔是真的嗎?
根據我所知,您不能假定數據結構(如字典)將按照您初始化的順序保存其中的值。 例如:Python數據結構順序
d = {1:10,2:20,3:30}
當您打印這裏面一個for循環,其結果可能是:
{2:20,1:10,3:30}
爲什麼會發生 - 爲什麼詞典(或其他數據結構)將不會保留按特定順序的值? 僅僅對字典纔是真的嗎?
在Python內建類型中,字典和集合都是如此。列表和元組保存順序。訂單版本的字典有collections.OrderedDict
。對於其他類型(例如,非Python內置的庫),您只需閱讀文檔。對於「數據結構」在Python中做什麼沒有一般規則。您必須查看每種類型的文檔以瞭解它所做或未定義的行爲。
Python確實定義了「序列」的概念,它被定義爲有序(列表和元組是序列)。字典是一個「映射」,它不需要有順序。 (有關詳細信息,請參見the Python glossary和the collections module)。
至於爲什麼,這是字典的實現方式。基本上,如果他們不需要跟蹤訂單,他們可以更快,並且在很多情況下,您不關心訂單,因此他們被實現爲無序集合以提高效率。
是的,它只是字典。在下面,字典實際上並不存儲這些值,而是作爲與該值配對的密鑰的hash。這允許非常快速的查找。列表和元組維護秩序。
詞典將命令他們的條目,使鍵搜索有效。如果你想保持你的密鑰與他們添加的順序相同,請嘗試一個OrderedDict
。
dict
s和set
s in python lost order。這是因爲它們被實現爲散列表,因此更關心快速查找時間而不是保存訂單。
如果您正在尋找一個適合訂單保存的數據結構,那麼您應該查看list
。在你的情況,你可以使用元組的列表如下:
In [255]: L = []
In [256]: L.append((1,10))
In [257]: L.append((2,20))
In [258]: L.append((3,30))
In [259]: L
Out[259]: [(1, 10), (2, 20), (3, 30)]
但是,如果你想維持秩序和希望獲得更快的查找時間比list
所提供的,那麼你很可能更好與OrderedDict
:
In [265]: d = collections.OrderedDict()
In [266]: d[1]=10
In [267]: d
Out[267]: OrderedDict([(1, 10)])
In [268]: d[2]=20
In [269]: d
Out[269]: OrderedDict([(1, 10), (2, 20)])
In [270]: d[3]=30
In [271]: d
Out[271]: OrderedDict([(1, 10), (2, 20), (3, 30)])
希望這有助於
因爲沒有人真正解釋了爲什麼'它happens'你的問題的一部分,http://www.laurentluce.com/posts/python-dictionary-implementation / – John