我对以下输出有点困惑。 我不明白执行循环的顺序。
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
感谢您的帮助
答案 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)
按字定义,字典没有顺序。这使得它进入了危险的“未定义行为”区域 - 在你编程的任何东西中依赖它都不是一个好主意,因为它可以在实现/实例之间突然改变。即使它恰好按照你现在想要的方式工作......它会在以后给你一块地雷。