Get:TypeError:'dict_values'对象在使用python 3.2.3时不支持索引。

这是我的代码:

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

在Python 3中, dict.values() (以及dict.keys()dict.items() )返回一个view ,而不是一个列表。 请参阅这里的文档。 因此,您需要将呼叫打包为dict.values() ,如下所示:

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

你的代码更简单的版本将是:

 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()方法返回一个字典视图对象 ,而不是Python 2中的列表。字典视图有一个长度,可以迭代,支持成员testing,但不支持索引。

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

 {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()方法返回的顺序。