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循环)的顺序是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python中for循环的用法

for 循环遍历字典中的键值两种方法

Python基础之for循环

Python创建字典语法和字典应用场景是啥?

Python - 尝试通过 for 循环创建字典

Python循环与判断