2009-02-08 23 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})