Get: TypeError: 当使用 python 3.2.3时,‘ dict_values’对象不支持索引

这是我的暗号:

{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?

201228 次浏览

代码的一个简单版本是:

dict(zip(names, d.values()))

如果希望保持相同的结构,可以将其更改为:

vlst = list(d.values())
{names[i]: vlst[i] for i in range(len(names))}

(你可以很容易地把 list(d.values())代替 vlst放在理解中; 这样做只是浪费,因为每次都会重新生成列表)。

在 Python 3中,dict.values()(以及 dict.keys()dict.items())返回 view,而不是列表。请参阅文档 给你。因此,您需要将对 dict.values()的呼叫包装在对 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)}

到目前为止,最简单、最快速的方法是:

dict(zip(names, d.values()))

因为 zip()根本不在乎。

然而,请注意,所有这些方法都会给出取决于 d的实际内容的不同结果。为了克服这个问题,您可以使用一个 命令代替,它会记住键首先插入的顺序,所以您可以依靠 values()方法返回的顺序。

Something Update 在 Python 3.7 + 常规字典中保持插入顺序,因此不再需要使用 OrderedDict。(实际上在 CPython 3.6中也是这样,但它还不是官方的ーー也就是说,它只是一个 实施细节,而不是 语言规范语言规范的一部分)。