时,这是我的代码:获取:类型错误:“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兼容?
时,这是我的代码:获取:类型错误:“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
,而不是一个列表。请参阅文档here。因此,您需要将您的电话换到dict.values()
在调用list
像这样:
v = list(d.values())
{names[i]:v[i] for i in range(len(names))}
@JessePet看起来你可能拼错了'values'作为'vaules'在那里。 – andersschuller
@andersshuller:你是正确的。 –
的OP的代码是unpythonic为大家看着这一点 - 在Python我们避免指数(慢,不美观)。正确的方法是@ DavidRobinson的[答](https://stackoverflow.com/a/17431678/281545):'字典(zip(names,d.values()))'。当然,这个代码也依赖于被排序的值作为名称,但决不是保证。 –
你的代码的简化版本是:
dict(zip(names, d.values()))
如果你想保持相同的结构,你可以把它改成:
vlst = list(d.values())
{names[i]: vlst[i] for i in range(len(names))}
(你可以很容易地把list(d.values())
的理解,而不是vlst
内,它只是浪费这样做,因为它会重新生成每次列表)。
Unfortuately,当我使用VLST例子中,我得到一个错误“‘字典’对象有没有属性‘值’ –
@JessePet:我看不出这是可能的,尤其是在自己的代码'd.values() '没有错误地工作(直到你尝试索引它)。是否有可能拼写'values'或一些simliar错误? –
我没拼错值,它是惊人的我至少可以说 –
在Python 3 dict.values()
方法返回一个dictionary view object,而不是一个列表像它在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()
方法返回的顺序指望的顺序。
'values'现在返回一个视图对象http://docs.python.org/3.2/library/stdtypes.html#dictionary-view-objects – dm03514
你为什么要依靠'values'的顺序从返回字典呢? –
呀,这个代码是不可靠的,除非d是'OrderedDict' - 即使它是好像必须有一个更好的办法。 –