【问题标题】:Python Dictionary Key Order With Comprehensions带理解的 Python 字典键顺序
【发布时间】:2018-08-05 10:11:01
【问题描述】:

我第一次搞乱字典,出现了一些让我感到困惑的事情。使用两个列表创建一个新字典,关键部分的列表术语的顺序似乎是错误的。这是我的代码:

list1 = ["a", "b", "c", "d"]
list2 = [5,3,7,3] 
newDict = {list1[c]: number for c, number in enumerate(list2)}
print(newDict)

这给了我以下信息:

{'a': 5, 'd': 3, 'c': 7, 'b': 3}

为什么会这样?当然,从列表中获取术语的“c”值是从 0 开始向上的,那么为什么不创建具有相同顺序字母的字典呢?

谢谢。

【问题讨论】:

  • 字典是无序的数据结构。
  • 请注意,您可以只使用dict(zip(list1, list2))
  • 3.6Dictionaries are unordered之前的版本
  • 通常我会,但这是一个物理作业,不希望我们使用我们尚未正式教授过的内容。这就是我实际上使用字典的原因。不过还是谢谢。
  • @bro-grammer 从技术上讲,在 Python 3.6 中,字典保留插入顺序的事实是一个实现细节。它将成为 >= 3.7 版本规范的一部分

标签: python python-3.x list dictionary for-loop


【解决方案1】:

为了提高效率,传统的 Python 字典是无序的。如果您需要订购,那么您需要OrderedDict

>>> from collections import OrderedDict
>>> newDict = OrderedDict((list1[c], number) for c, number in enumerate(list2))
>>> print(newDict)
OrderedDict([('a', 5), ('b', 3), ('c', 7), ('d', 3)])

In Python 3.7,普通python字典,使用新算法实现,会排序。在那之前,如果您需要订购,请使用OrderedDict

【讨论】:

  • 是什么让您认为他们需要这个?他们只是在问为什么它不能保持秩序,而不是说他们想要。
  • @StefanPochmann 在人类行为的正常规则下,OP 不会花时间询问订单,除非出于某种原因,这对他很重要。
【解决方案2】:

Python 字典不保留它们的顺序,但还有另一种数据类型可以保留:OrderedDict,来自集合模块。

【讨论】:

    【解决方案3】:

    字典是无序的。事实上,如果你在不同的计算机上运行你的程序,你可能会得到不同的键顺序。这是python内置字典的一个有意的特性。

    要了解原因,请查看this stackoverflow question

    【讨论】:

      【解决方案4】:

      从 Python 3.7 开始,字典是插入排序的。 请参阅此 stackoverflow 讨论 Are dictionaries ordered in Python 3.6+?

      【讨论】:

        猜你喜欢
        • 2020-11-02
        • 1970-01-01
        • 2017-07-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        相关资源
        最近更新 更多