2013-07-02 17 views
51

を使用するときに「dict_values」オブジェクトは、インデックス作成をサポートしていません。これは私のコードです:取得:TypeError例外:パイソン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

dict.keys()とと一緒に、dict.values()は、リストではなくviewを返します。ドキュメントhereを参照してください。そのため、そのようlistの呼び出しでdict.values()にあなたの呼び出しをラップする必要があります。

は、Python 3では dict.values()方法は dictionary view object返し
v = list(d.values()) 
{names[i]:v[i] for i in range(len(names))} 
+1

@JessePet 'vaules'として' values'のスペルが間違っているようです。 – andersschuller

+0

@andersshuller:あなたは正しいです。 –

+1

OPのコードは、これを見ている人にとっては不愉快です.Pythonでは、索引を避けています(遅く、醜い)。正しい方法は@DavidRobinsonの[answer](https://stackoverflow.com/a/17431678/281545): 'dict(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

残念なことに、私が最初の例を使用すると、 "'dict'オブジェクトに属性 'values'という属性がありません。 –

+0

@JessePet:それは可能でしょうか、特にあなた自身のコード' d.values() 'エラーなしで作業しました(インデックスを作成しようとするまで)。'values'やいくつかのsimliarエラーのスペルを間違える可能性はありますか? –

+0

私は値を忘れていませんでした。それは驚くべきことです。 –

2

、それは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()メソッドによって返される順序を数えることができます。

関連する問題