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

bra*_*orm 6 python dictionary for-loop

可能重复:
为什么python会这样排序我的字典?

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

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

for key in domains:
    print key
Run Code Online (Sandbox Code Playgroud)

这里的输出是

sk
de
no
us
hu
Run Code Online (Sandbox Code Playgroud)

但不是

de
sk
hu
us
no
Run Code Online (Sandbox Code Playgroud)

同样,这里

num = {1:"one",4:"two",23:"three",10:"four"}
for key in num:
    print key
output is
1
10
4
23
Run Code Online (Sandbox Code Playgroud)

但不是

1
4
23
10
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Mar*_*ers 6

Python词典不保留排序:

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

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

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


NPE*_*NPE 5

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

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

for key in sorted(domains):
    print key
Run Code Online (Sandbox Code Playgroud)

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


sid*_*idi 5

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

for key in sorted(domains):
    print key
Run Code Online (Sandbox Code Playgroud)

会产生

de
hu
no
sk
us
Run Code Online (Sandbox Code Playgroud)

如果您想根据值进行订购,可以使用类似的东西sorted(domains.items(), key = lambda(k, v): (v, k)).