9

可能重复:
为什么 python 像这样订购我的字典?

我对从以下得到的输出有点困惑。我不明白执行循环的顺序。

domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

for key in domains:
    print key

这里的输出是

sk
de
no
us
hu

但不是

de
sk
hu
us
no

同样,这里

num = {1:"one",4:"two",23:"three",10:"four"}
for key in num:
    print key
output is
1
10
4
23

但不是

1
4
23
10

感谢您的帮助

4

5 回答 5

8

Python 字典不保留排序

键和值以非随机的任意顺序列出,因 Python 实现而异,并且取决于字典的插入和删除历史

CPython 中的字典被实现为哈希表,以实现快速查找和成员资格测试,并且枚举键或值按照项目在该表中列出的顺序进行;它们插入的位置取决于键的哈希值,以及之前是否有任何东西被哈希到同一个插槽。

您必须在每次显示时对键进行排序,或者使用不同类型的数据结构来保留排序。Python 2.7 或更高版本有一个collections.OrderedDict()类型,或者您可以使用一个二值元组列表(此时单个键值对的查找会很慢)。

于 2013-01-21T19:19:53.087 回答
7

Python 字典没有顺序。但是,您可以使用该sorted(domains)函数指定订单。默认情况下,它使用键进行排序。

for key in sorted(domains):
    print key

会产生

de
hu
no
sk
us

如果要根据值进行排序,可以使用类似sorted(domains.items(), key = lambda(k, v): (v, k)).

于 2013-01-21T19:20:57.707 回答
6

顺序未指定。但是,它保证在没有修改字典的情况下保持不变。

您可以在迭代时对键进行排序:

for key in sorted(domains):
    print key

最后,需要注意的是,较新版本的 Python 具有collections.OrderedDict保留插入顺序的。

于 2013-01-21T19:20:30.593 回答
2

如果你想要一个 Python 中的有序字典,你必须使用collections.OrderedDict

于 2013-01-21T19:22:02.200 回答
2

根据定义,字典没有顺序。这将其置于危险的“未定义行为”区域 - 在您编程的任何内容中依赖它都不是一个好主意,因为它可能会在实现/实例之间突然发生变化。即使它现在正好按你想要的方式工作......它以后会为你埋下地雷。

于 2013-01-21T19:22:12.797 回答