2017-04-07 107 views
0

我想澄清一下Python中的詞典的一些觀點,這可能會在未來幫助其他Python愛好者。Python:詞典以及它們如何用iteritems存儲和訪問()

讓我們從一個簡單的字典開始。

foo = {'a_2': 4, 'b_2': 5, 'a_1': 2, 'b_1': 1} 

和顯示foo給人,

In [31]: foo 
Out[31]: {'a_1': 2, 'a_2': 4, 'b_1': 1, 'b_2': 5} 

人們可以看到,foo似乎是 '無序'。然而,在進一步閱讀之後,我發現字典並不固有地排序,並且字典顯示時的輸出僅基於密鑰的哈希值。

我產生了困惑,當我遍歷使用foo.iteritems()foo.items()字典(兩者產生相同的結果。)

for k, v in foo.iteritems(): 
    print '{}: {}'.format(k, foo[k]) 

b_1: 1 
b_2: 5 
a_2: 4 
a_1: 2 

這個輸出順序不與我在foo進入鍵/值的順序一致或當foo被調用時它們被輸出的方式。

這是否與foo.iteritems()如何生成其鍵/值或其他內容有關?

我在Ubuntu

+0

您的repl可能只是爲您排序以便於閱讀。另外,foo不是「叫」。你的repl只是顯示foo。沒有辦法「打電話」字典 – acushner

+0

當您顯示'foo'時,IPython正在對鍵進行排序。 – user2357112

回答

1

PEP 372,使用Python 2.7在目前的Python版本,目前廣泛使用的內置字典類型不指定存儲鍵/值對的順序。這使得很難將字典用作某些特定用例的數據存儲。

快譯通Python中還沒有爲這種用法任何順序:),你可以使用collections.OrderedDict這樣的:

foo = {'a_2': 4, 'b_2': 5, 'a_1': 2, 'b_1': 1} 
import collections 
order = collections.OrderedDict(foo) 

for k,v in order.items(): 
    print k,v 

您可以閱讀有關OrderedDict

+0

所以我認爲我看到的這種不一致不僅僅是基於內在的缺乏排序,而且可能是內置的REPL? –

1

權。訂單可能會或可能不會達成一致。訂購不保證。實施可以自由選擇任何順序方便。換句話說,你上面看到的可能與你從Python獲得的順序不同,然後是Cython,然後是基於LISP的Python等。

事實上,就我目前的安裝而言,即使Python 2.7和Python 3.5也有所不同。

如果您需要訂單,請使用OrderedDict對象。如果您只是對實現感到好奇,我建議您查找特定實現的文檔。

+0

爲了獲得更多樂趣,由於哈希隨機化,訂單可能因同一Python版本的不同運行而有所不同。 – kindall

+0

好的,謝謝你們。這現在更有意義。我認爲有幾個因素影響我的輸出,包括命令不被排序,acchner在他的回覆中指出我的REPL,以及我的Python版本。不過,我認爲這一切都源於詞典不是固有的命令。我可能會使用有序的字典或排序我有 –

相關問題