2013-07-02 33 views
51

时,这是我的代码:获取:类型错误:“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兼容?

+1

'values'现在返回一个视图对象http://docs.python.org/3.2/library/stdtypes.html#dictionary-view-objects – dm03514

+3

你为什么要依靠'values'的顺序从返回字典呢? –

+0

呀,这个代码是不可靠的,除非d是'OrderedDict' - 即使它是好像必须有一个更好的办法。 –

回答

81

在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))} 
+1

@JessePet看起来你可能拼错了'values'作为'vaules'在那里。 – andersschuller

+0

@andersshuller:你是正确的。 –

+1

的OP的代码是unpythonic为大家看着这一点 - 在Python我们避免指数(慢,不美观)。正确的方法是@ DavidRobinson的[答](https://stackoverflow.com/a/17431678/281545):'字典(zip(names,d.values()))'。当然,这个代码也依赖于被排序的值作为名称,但决不是保证。 –

6

你的代码的简化版本是:

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

如果你想保持相同的结构,你可以把它改成:

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

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

+0

Unfortuately,当我使用VLST例子中,我得到一个错误“‘字典’对象有没有属性‘值’ –

+0

@JessePet:我看不出这是可能的,尤其是在自己的代码'd.values() '没有错误地工作(直到你尝试索引它)。是否有可能拼写'values'或一些simliar错误? –

+0

我没拼错值,它是惊人的我至少可以说 –

2

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

相关问题