当你调用dict.values()时,返回项的顺序取决于键的has值。这似乎在所有版本的cPython中都非常一致,但是dict simply states that the ordering is "arbitrary"的python手册。
我记得在某个地方读过,实际上有一个PEP专门说明了items()和values()方法的预期顺序。
仅供参考,如果这种行为确实是我正在努力的类的保证行为,我可以大大简化并加快我正在研究的课程。另一方面,如果这仅仅是cPython的一个偶然且无法记录的特征,那么最好不要相信它。
答案 0 :(得分:7)
来自http://docs.python.org/library/stdtypes.html:
键和值列在 任意顺序是非随机的, 不同的Python实现, 并取决于字典 插入和删除的历史。
答案 1 :(得分:6)
我认为PEP-3106尽可能接近:
规范暗示了项目的返回顺序 .keys(),. value()和.items()是 相同(就像在Python 2.x中一样), 因为订单全部来自 dict迭代器(大概是 任意但稳定只要一个字典 没有修改)。这可以表达 由以下不变量:
list(d.items()) == list(zip(d.keys(), d.values()))
答案 2 :(得分:2)
“任意”与“偶然”不同。
但它与“无证件”相同。由于字典基于散列,因此您无法 - 确实 - 保证基于散列算法和发生的冲突进行排序。
要保证订单,请使用sorted
功能。
或者你可以找到一个好的ordered dictionary实现,而不是dict。