这是我拥有的字典

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”打印出来时,join(myDict)得到这个

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


我知道字典是无序的,但每次都会出现,而且我也不知道为什么。

评论

无序意味着订单与您无关。这并不意味着顺序不一致。

@S。洛特:准确地。这就是我在CS课程中所教的内容-“无序集合将始终具有一定的顺序,无序意味着我们不应依赖它”

但是,如果您对订购感兴趣,那么这不是您应该寻找的数据结构。字典是项的无序集合。列表和元组保留顺序。

更精确:python字典的顺序是任意的,但是确定性的(根据python规范)。确定性意味着它总是会表现出相同的方式。

现在,我已经看到了这个问题,我建议您是否要保留顺序,可以将每个字典键值对放入一个元组/列表中,这样它们将始终具有相同的顺序

#1 楼

对于旧版本的Python,真正的问题应该是“为什么不呢?” —无序字典通常实现为哈希表,其中元素的顺序定义明确,但不是立即显而易见的(用于说明此情况的Python文档)。您的观察结果完全符合哈希表的规则:明显的任意但恒定的顺序。

Python从那以后更改了dict实现以保留插入顺序,并且从Python 3.7开始保证。因此,该实现不再构成纯哈希表(但在实现中仍使用哈希表)。

评论


值得阅读python字典源文件中的注释;我已经将其发布在关于“您所见过的最佳评论”的stackoverflow帖子中:is.gd/iSyN

–llimllib
09年2月9日在6:05

dict的一些内部实现可以在laurentluce.com/posts/python-dictionary-implementation中找到。一位python编码人员提供了不错的演示文稿,但目前无法找到(我认为它来自PyCon Australia)。

– Maciej Gol
13年10月2日在9:07

#2 楼

内置字典类型的规范
不保留任何顺序,最好将字典视为key: value对的无序集合...

您可能需要检查OrderedDict模块,它是带有关键字插入顺序的有序字典的实现。

#3 楼

您可以依靠的关于字典排序的唯一事情是,如果不对字典进行任何修改,则排序将保持不变。例如,在不修改字典的情况下对字典进行两次迭代将导致相同的键序列。但是,尽管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})