時,這是我的代碼:獲取:類型錯誤:「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' - 即使它是好像必須有一個更好的辦法。 –