这是我的代码:
{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 兼容?
这是我的代码:
{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()
and dict.items()
)返回一个view
,而不是一个列表。请参阅此处的文档。因此,您需要将您的呼叫包装dict.values()
在这样的呼叫中list
:
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 中那样的列表。字典视图有长度,可以迭代,并且支持成员资格测试,但不支持索引。
要使您的代码在两个版本中都能正常工作,您可以使用以下任何一种:
{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()
方法返回的顺序。