2009-02-08 21 views
42

這裏是字典我有爲什麼python像我這樣的詞典排序?

propertyList = { 
    "id":   "int", 
    "name":   "char(40)", 

    "team":   "int", 
    "realOwner": "int", 

    "x":   "int", 
    "y":   "int", 

    "description": "char(255)", 

    "port":   "bool", 
    "secret":  "bool", 
    "dead":   "bool", 
    "nomadic":  "bool", 

    "population": "int", 
    "slaves":  "int", 
} 

但是,當我把它打印出來爲「\ n」。加入(myDict)我得到這個

name 
nomadic 
dead 
port 
realOwner 
secret 
slaves 
team 
y 
x 
population 
id 
description 

我知道,一個字典是無序的,但它每次都是一樣的,我不知道爲什麼。

+36

無序意味着順序是關你的事。這並不意味着訂單不一致。 – 2009-02-09 00:11:53

+1

@S。洛特:確切地說。這就是我在CS課程中教過的東西 - 「無序集合總是有一定的順序,*無序*意味着我們不應該依賴它' – Abgan 2009-02-09 09:25:37

回答

79

真正的問題應該是「爲什麼不?」......一個無序的字典最有可能實現爲hash table(事實上,Python documentation完全陳述了這一點),其中元素的順序是定義良好但不是立即顯而易見的。您的觀察結果與哈希表的規則完美匹配:顯然是任意的,但不變的順序。

10

specification爲內置的字典式 聲明的順序保存任何,最好是想詞典作爲一組無序的key: value雙...

您可能要檢查OrderedDict module,這是一個帶有密鑰插入順序的有序字典的實現。

8

關於字典順序的唯一可以依賴的是,如果字典沒有修改,順序將保持不變;例如,在字典上迭代字典兩次而不修改它將導致相同的鍵序列。然而,儘管Python字典的順序是確定性的,它可以被因素的影響,如插入和刪除的順序,以平等的字典可以使用不同的排序結束:

>>> {1: 0, 2: 0}, {2: 0, 1: 0} 
({1: 0, 2: 0}, {1: 0, 2: 0}) 
>>> {1: 0, 9: 0}, {9: 0, 1: 0} 
({1: 0, 9: 0}, {9: 0, 1: 0})