【发布时间】:2018-04-20 16:56:28
【问题描述】:
这个问题来自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() 按[k2, k1, k3] 的顺序返回d 的密钥。现在是否始终保证d.values() 返回与[v2, v1, v3] 相同的相对顺序?此外,无论这些函数被调用多少次,顺序是否保持不变?
Python 3.x (
我不是 100% 确定,但我相信 .keys 和 .values 在这里根本不保证任何排序,因为它们是类似集合的结构,因此根据定义没有顺序并且使您能够执行集合- 对它们进行类似操作。但我仍然想知道在这种情况下,两个调用之间是否存在 任何 种相对排序。 我猜不是。如果有人能肯定或纠正我,我将不胜感激。
【问题讨论】:
-
在 python 3.6+ 中(我认为)有命令,问题不是你是否可以使用它,而是你是否应该(我在“你应该”阵营)。另请参阅stackoverflow.com/a/39980744/1240268
-
看起来
keys()和values()出现的顺序相同。在 python 2 中,它是任意的(但一致) - 但在 python 3 中,它似乎是按定义顺序排列的。无论哪种方式,依赖这个都不是一个好主意......没有理由使用items()。 Python 2 = repl.it/NwCu/0 Python 3 = repl.it/NwDC/0 -
@AndyHayden - 在我看来,规范中没有保证的事实是迄今为止不依赖它的最压倒性的理由:P 他们甚至在文档中说这是你应该的实现细节不要依赖...
-
@Shadow 我和Raymond Hettinger 在一起。我现在也到处使用 f-strings,所以如果他们想运行我的代码,每个人都必须升级。
-
@cᴏʟᴅsᴘᴇᴇᴅ 和 python 3 也是docs.python.org/3/library/stdtypes.html#dictionary-view-objects。也就是说,您链接到的答案没有损坏嗯,它仍然有点可疑 - 主要是因为您希望 .keys() 和 .values() 调用靠近在一起。如果有什么地方可以打赌它会达到我会的规格。
标签: python python-2.7 dictionary python-2.x