【问题标题】:Why is python ordering my dictionary like so? [duplicate]为什么 python 像这样订购我的字典? [复制]
【发布时间】:2010-10-06 06:47:25
【问题描述】:

这是我的字典

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 规范)。确定性意味着它将始终以相同的方式运行。
  • 现在我已经看到了这个问题,我建议如果您想保留顺序,您可以将每个字典键值对放在一个元组/列表中,这样它们将始终具有相同的顺序

标签: python dictionary


【解决方案1】:

对于旧版本的 Python,真正的问题应该是“为什么不呢?” — 无序字典通常以hash table 的形式实现,其中元素的顺序是明确定义的,但不是很明显(the Python documentation used to state this)。您的观察结果完全符合哈希表的规则:明显任意,但顺序不变。

Python 此后更改了其dict 实现以保留插入顺序和this is guaranteed as of Python 3.7。因此,该实现不再构成纯粹的哈希表(但在其实现中仍然使用哈希表)。

【讨论】:

  • 从 python 的字典源文件中阅读评论非常值得;我已经将它发布在关于“你见过的最好的评论”的 stackoverflow 帖子中:is.gd/iSyN
  • dict 的一些内部实现可以在这里laurentluce.com/posts/python-dictionary-implementation 找到。有一个 python 编码员的精彩演示文稿,但目前找不到(我认为它来自 PyCon Australia)。
【解决方案2】:

内置字典类型的specification 拒绝保留任何顺序,最好将字典视为一组无序的key: value 对...

您可能需要检查OrderedDict module,它是具有键插入顺序的有序字典的实现。

【讨论】:

    【解决方案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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多