135

这是我的代码:

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

这在使用 python 2.7.3 时完全正常;但是,当我使用 python 3.2.3 时,我收到一条错误消息'dict_values' object does not support indexing。如何修改代码以使其与 3.2.3 兼容?

4

3 回答 3

218

在 Python 3 中,dict.values()(连同dict.keys()and dict.items())返回一个view,而不是一个列表。请参阅此处的文档。因此,您需要将您的呼叫包装dict.values()在这样的呼叫中list

v = list(d.values())
{names[i]:v[i] for i in range(len(names))}
于 2013-07-02T17:10:39.263 回答
18

您的代码的更简单版本是:

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

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

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

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

于 2013-07-02T17:08:51.373 回答
9

在 Python 3 中,该dict.values()方法返回一个字典视图对象,而不是像在 Python 2 中那样的列表。字典视图有长度,可以迭代,并且支持成员资格测试,但不支持索引。

要使您的代码在两个版本中都能正常工作,您可以使用以下任何一种:

{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()))

但是请注意,所有这些方法都会为您提供根据实际内容而有所不同的结果d。为了克服这个问题,您可以使用OrderedDict代替,它会记住键首次插入其中的顺序,因此您可以依靠该values()方法返回的顺序。

于 2013-07-02T18:15:20.300 回答