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

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

<分区>

This question arises from this answer where one user uses d.keys() and d.values() separately to initialise a dataframe.

众所周知,python 3.6以下版本的字典是无序的。

考虑以下形式的通用字典:

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

其中键 k* 是任何可哈希对象,值 v* 是任何对象。当然不能保证顺序,但是d.keys()d.values()的顺序呢?

Python 2.x

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

Python 3.x (<3.6)

我不是 100% 确定,但我相信 .keys.values 不能保证这里的任何顺序,因为它们是类似集合的结构,因此没有定义的顺序,并使您能够对它们执行类似集合的操作。但我仍然想知道在这种情况下,两次调用之间是否存在任何 类型的相对顺序。 我猜不会。如果有人能肯定或纠正我,我将不胜感激。

最佳答案

一般规则:

  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 中,顺序是确定的(即以相同的方式创建两次字典将产生相同的顺序)。在 Python <3.6 中,它不再是确定性的,因此您也不能依赖它(我不确定这种非确定性是规范的一部分还是只是 CPython 实现细节)。

编辑:添加第 5 点,感谢@AndyHayden 的评论。

关于python - dict.keys() 和 dict.values() 保证什么顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47172349/

相关文章:

python - 如何去除字符串末尾的嘈杂模式?

python - 以三为单位迭代字符串

f# - 如何将字典条目的值声明为可变的?

python - 使用 list() 复制同一列表的字典键是否会产生彼此的引用?

python - 将两个字典合并到一个数据框中

python - Pygame 窗口没有响应,但程序继续运行

python - Google App Engine - 缺少 numpy.core.multiarray

python lxml 与 py2exe

python - 登录python

algorithm - 如何计算大型数据集中的倒置?