dict.keys()和dict.values()保证什么顺序?

时间:2017-11-08 05:43:48

标签: python python-2.7 dictionary python-2.x

  

此问题来自this answer,其中有一位用户   分别使用d.keys()d.values()初始化数据框。

众所周知,3.6版本的python版本中的字典不是有序的。

考虑表格的通用字典:

d = {k1 : v1, k2 : v2, k3 : v3}

k*是任何可清除对象,值v*是任何对象。当然,订单无法保证,但d.keys()d.values()的订单呢?

Python 2.x

d.keys()d.values()返回列表。说,.keys()d的顺序返回[k2, k1, k3]个键。现在始终保证 d.values()返回与[v2, v1, v3]相同的相对排序吗?此外,无论调用这些函数多少次,顺序是否保持不变?

Python 3.x(< 3.6)

我不是100%肯定,但我相信.keys.values在这里根本不保证任何排序,因为它们是类似集合的结构,因此根据定义没有顺序并使您能够对它们执行类似集合的操作。但我仍然有兴趣知道在这个实例中两个调用之间是否存在任何类型的相对排序。 我猜不会。如果有人可以肯定或纠正我,我会感激。

1 个答案:

答案 0 :(得分:6)

一般规则:

  1. 在谈论保证什么和什么不保证之前,即使某些排序似乎是“保证”,但事实并非如此。你不应该依赖它。它被认为是不好的做法,可能导致令人讨厌的错误。
  2. d.keys()d.values()d.items()都按相应的顺序返回元素。该订单应视为任意(不应对其进行任何假设)。 (docs
  3. d.keys()d.values()d.items()的连续调用是“稳定的”,因为它们可以保证保留先前调用的顺序(假设之间没有插入/删除电话)。
  4. 自CPython的V3.6 dict has been reimplemented以来,它现在保留插入顺序。这不是改变的目标,而是副作用,它不是python规范的一部分,只是CPython实现的一个细节。请参阅上面的第1点:依赖于此是不好的做法,不应该这样做。无论如何,你应该避免编写特定于CPython的代码。
  5. 在Python2中,顺序是确定性的(即以相同的方式创建一个dict两次将产生相同的顺序)。在Python< 3.6中,它不再是确定性的,所以你也不能依赖它(我不确定这个非确定性是规范的一部分还是仅仅是CPython实现细节)。
  6. 编辑:加上第5点,感谢@ AndyHayden的评论。