2012-11-22 105 views
0

根據我所知,您不能假定數據結構(如字典)將按照您初始化的順序保存其中的值。 例如:Python數據結構順序

d = {1:10,2:20,3:30} 

當您打印這裏面一個for循環,其結果可能是:

{2:20,1:10,3:30} 

爲什麼會發生 - 爲什麼詞典(或其他數據結構)將不會保留按特定順序的值? 僅僅對字典纔是真的嗎?

+2

因爲沒有人真正解釋了爲什麼'它happens'你的問題的一部分,http://www.laurentluce.com/posts/python-dictionary-implementation / – John

回答

1

在Python內建類型中,字典和集合都是如此。列表和元組保存順序。訂單版本的字典有collections.OrderedDict。對於其他類型(例如,非Python內置的庫),您只需閱讀文檔。對於「數據結構」在Python中做什麼沒有一般規則。您必須查看每種類型的文檔以瞭解它所做或未定義的行爲。

Python確實定義了「序列」的概念,它被定義爲有序(列表和元組是序列)。字典是一個「映射」,它不需要有順序。 (有關詳細信息,請參見the Python glossarythe collections module)。

至於爲什麼,這是字典的實現方式。基本上,如果他們不需要跟蹤訂單,他們可以更快,並且在很多情況下,您不關心訂單,因此他們被實現爲無序集合以提高效率。

0

是的,它只是字典。在下面,字典實際上並不存儲這些值,而是作爲與該值配對的密鑰的hash。這允許非常快速的查找。列表和元組維護秩序。

0

詞典將命令他們的條目,使鍵搜索有效。如果你想保持你的密鑰與他們添加的順序相同,請嘗試一個OrderedDict

1

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)]) 

希望這有助於