2013-07-02 56 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()方法返回的順序指望的順序。

相關問題