Python字典中的循环顺序是怎样的?

11 投票
5 回答
18657 浏览
提问于 2025-04-17 13:19

我对下面这个代码的输出有点困惑。
我不太明白这个循环执行的顺序。

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 个回答

6

顺序是没有具体规定的。不过,如果字典没有被修改,顺序是不会改变的。

在遍历的时候,你可以对键进行排序:

for key in sorted(domains):
    print key

最后,值得一提的是,更新版的Python有一个叫做 collections.OrderedDict 的东西,它可以保持 插入顺序

8

Python 的字典不保留顺序

字典里的键和值是以一种不固定的顺序列出的,这种顺序不是随机的,会因不同的 Python 实现而有所不同,还和字典的插入和删除历史有关。

在 CPython 中,字典是用哈希表来实现的,这样可以快速查找和测试某个值是否在字典里。列出键或值的顺序是根据它们在哈希表中的位置来决定的;这些位置是根据键的哈希值来确定的,如果之前有其他东西被哈希到同一个位置,也会影响插入的位置。

所以每次显示字典内容时,你要么得每次都对键进行排序,要么就得使用其他类型的数据结构来保留顺序。Python 2.7 及更新版本提供了collections.OrderedDict()这种类型,或者你也可以使用一个包含两个值的元组的列表(不过这样查找单个键值对会比较慢)。

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)) 的写法。

撰写回答