python字典中循环(for循环)的顺序是什么

时间:2013-01-21 19:18:56

标签: python dictionary for-loop

  

可能重复:
  Why is python ordering my dictionary like so?

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

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

感谢您的帮助

5 个答案:

答案 0 :(得分:5)

Python词典do not preserve ordering

  

键和值以任意顺序列出,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史

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

每次显示或使用不同类型的数据结构以保持排序时,您都必须对键进行排序。 Python 2.7或更新版本具有collections.OrderedDict()类型,或者您可以使用两值元组的列表(此时各个键值对的查找将变慢)。

答案 1 :(得分:5)

Python词典没有订单。但是,您可以使用sorted(domains)功能指定订单。默认情况下,它使用密钥进行排序。

for key in sorted(domains):
    print key

将产生

de
hu
no
sk
us

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

之类的内容

答案 2 :(得分:4)

订单未指定。但是,在没有对字典进行修改的情况下,它保证保持不变。

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

for key in sorted(domains):
    print key

最后,注意新版本的Python有collections.OrderedDict可能很有用,它会保留插入顺序

答案 3 :(得分:1)

如果您想在Python中使用有序字典,则必须使用collections.OrderedDict

答案 4 :(得分:1)

按字定义,字典没有顺序。这使得它进入了危险的“未定义行为”区域 - 在你编程的任何东西中依赖它都不是一个好主意,因为它可以在实现/实例之间突然改变。即使它恰好按照你现在想要的方式工作......它会在以后给你一块地雷。