这是我的暗号:
{names[i]:d.values()[i] for i in range(len(names))}
这在使用 python2.7.3时完全可以正常工作; 但是,当我使用 python3.2.3时,我得到一个表示 'dict_values' object does not support indexing的错误。如何修改代码使其兼容3.2.3?
'dict_values' object does not support indexing
代码的一个简单版本是:
dict(zip(names, d.values()))
如果希望保持相同的结构,可以将其更改为:
vlst = list(d.values()) {names[i]: vlst[i] for i in range(len(names))}
(你可以很容易地把 list(d.values())代替 vlst放在理解中; 这样做只是浪费,因为每次都会重新生成列表)。
list(d.values())
vlst
在 Python 3中,dict.values()(以及 dict.keys()和 dict.items())返回 view,而不是列表。请参阅文档 给你。因此,您需要将对 dict.values()的呼叫包装在对 list的呼叫中,如下所示:
dict.values()
dict.keys()
dict.items()
view
list
v = list(d.values()) {names[i]:v[i] for i in range(len(names))}
在 Python3中,dict.values()方法返回一个 字典视图对象字典视图对象、 没有列表,就像在 Python2中一样。字典视图有一个长度,可以迭代,并支持成员资格测试,但不支持索引。
为了让代码在两个版本中都能正常工作,您可以使用以下任何一种:
{names[i]:value for i,value in enumerate(d.values())}
强
values = list(d.values()) {name:values[i] for i,name in enumerate(names)}
到目前为止,最简单、最快速的方法是:
因为 zip()根本不在乎。
zip()
然而,请注意,所有这些方法都会给出取决于 d的实际内容的不同结果。为了克服这个问题,您可以使用一个 命令强代替,它会记住键首先插入的顺序,所以您可以依靠 values()方法返回的顺序。
d
values()
Something Update 在 Python 3.7 + 常规字典中保持插入顺序,因此不再需要使用 OrderedDict。(实际上在 CPython 3.6中也是这样,但它还不是官方的ーー也就是说,它只是一个 实施细节,而不是 语言规范语言规范的一部分)。
OrderedDict