python字典中循环(for循环)的顺序是啥[重复]
Posted
技术标签:
【中文标题】python字典中循环(for循环)的顺序是啥[重复]【英文标题】:what is the order of looping (for loop) in python dictionary [duplicate]python字典中循环(for循环)的顺序是什么[重复] 【发布时间】:2013-01-04 22:08:30 【问题描述】:可能重复: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
感谢您的帮助
【问题讨论】:
如果你真的感兴趣,请看我对这个问题的回答:***.com/questions/12165200/… 字典中的插入顺序从 Python3.7 开始保留。参见python文档中的information on iterator, iter(), for dictionaries,也可以在堆栈溢出中找到more detailed explanation 【参考方案1】: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】:Python 字典do not preserve ordering:
键和值以非随机的任意顺序列出,因 Python 实现而异,并且取决于字典的插入和删除历史
CPython 中的字典被实现为hash table 以实现快速查找和成员资格测试,并且枚举键或值按照项目在该表中列出的顺序进行;它们插入的位置取决于键的哈希值,以及之前是否有任何东西被哈希到同一个插槽。
您必须在每次显示时对键进行排序,或者使用不同类型的数据结构来保持排序。 Python 2.7 或更高版本具有 collections.OrderedDict()
类型,或者您可以使用二值元组列表(此时单个键值对的查找会很慢)。
【讨论】:
@mgilson:是的,这句话确实令人困惑,可能会被误解。会更正。 我认为第一句话也有点误导,尤其是引用的内容正好相反。您开始说not ordered
,然后引用说明它们在arbitrary order which is non-random
中。换句话说,有顺序,但不是立即清楚顺序是什么。挑剔,但仍然有些混乱。
@ernie: '不保留排序' 那么?
不,他们仍然保留排序。就像您多次遍历数组一样,顺序将是一致的(因此来自文档的非随机)。也许它应该只是引用,强调arbitrary order which is non-random
?
@ernie -- 我认为可以说它们没有被订购。这是一种非常常见的说法,如果您以任何方式(包括创建它)更改字典,则不能依赖该顺序。 Martijn - '不保留排序'就像你可以说的一样好,恕我直言。【参考方案3】:
根据定义,字典没有顺序。这将其置于危险的“未定义行为”区域 - 在您编程的任何内容中依赖它都不是一个好主意,因为它可能会在实现/实例之间突然发生变化。即使它现在正好按你想要的方式工作......它以后会为你埋下地雷。
【讨论】:
【参考方案4】:如果您想要 Python 中的有序字典,您必须使用 collections.OrderedDict
【讨论】:
【参考方案5】:订单未指定。但是,它保证在没有修改字典的情况下保持不变。
迭代时可以对key进行排序:
for key in sorted(domains):
print key
最后,需要注意的是,较新版本的 Python 具有 collections.OrderedDict
,它保留了插入顺序。
【讨论】:
以上是关于python字典中循环(for循环)的顺序是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章