2015-05-13 68 views
1

字典被填充有連續的整數密鑰,這樣的:Python字典迭代順序意外排序。爲什麼?

d = dict() 
for i in range(0, 10): 
    d[i] = 100-i 

後來,字典項被重複這樣的:

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

結果顯示項被按數字順序重複:

0 100 
1 99 
2 98 
3 97 
4 96 
5 95 
6 94 
7 93 
8 92 
9 91 

事實證明,這是我想要的行爲,但不是我所期望的。我期望隨機順序的字典迭代。這裏發生了什麼事情,我可以在公開發布的代碼中依賴這種行爲嗎?

回答

2

詞典不是隨機排列的。他們在arbitrary順序。在這種情況下,你很幸運,他們被分類。明天,他們可能不會。如果您需要隨機性,請使用random。如果您需要排序順序,請使用sorted()。正如@BenjaminWohlwend在評論中提到的那樣,您可以使用collections.OrderedDict來跟蹤廣告訂單。

在這種情況下,我猜想字典正在做一些小整數鍵優化,就像一個數組(例如hash(1) == 1)。這不是一個有保證的行爲,並且可能對其他Python實現有不同的工作。

+2

如果需要插入順序,'OrderedDict'會有幫助https://docs.python.org/3/library/collections.html#collections.OrderedDict –

+3

這不是一個優化,只是CPython哈希的自然副作用整數。不過,最好不要依賴它! – jonrsharpe

+0

@jonrsharpe:在某種程度上有一個有意義的區別,我認爲CPython的散列本身就是對這個確切用例的優化。一個六個,另外六個。 – Kevin

1

該命令不是隨機的,它是任意的。這意味着你不能依賴它以任何特定順序迭代。它有時可能會按排序順序發生,但您不能認爲它會發生。