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