2012-01-21 9 views
39

私は.keys()を使用しようとしており、 のようなキーのリストを取得するのではなく、常に過去のものです。しかし、私はこれを得る。Python dictionary.keys()error

b = { 'video':0, 'music':23 } 
k = b.keys() 
print(k[0]) 

>>>TypeError: 'dict_keys' object does not support indexing 

print(k) 
dict_keys(['music', 'video']) 

私は狂っていない限り['music'、 'video']を印刷するだけです。

何が起こっているのですか?

+3

輸入ランダム:[**辞書・ビュー・オブジェクトは、**](HTTP://docs.python。 org/py3k/library/stdtypes.html#dictionary-view-objects)を参照してください。 –

+0

辞書には順序がないので、b.keys()[0]は一般的にはあまり役に立ちません。 –

答えて

85

のPython 3は、それが今で反復可能けど(それが今なくなっている、古いdict.iterkeysようなものだ)刃先交換式ではないdict_keysオブジェクトを返すようdict.keysの振る舞いを変更しました。あなたはそのようkを割り当てた場合

>>> b = { 'video':0, 'music':23 } 
>>> k = list(b.keys()) 
>>> k 
['music', 'video'] 

か、単に

>>> list(b) 
['music', 'video'] 
+14

ちょうど 'list(b)'は同じです –

+2

@JochenRitzel:良い点、それを加えました! –

+0

ありがとうございます。それでは、dict_keysをどのように反復するのですか? – tokageKitayama

8

k = list(b.keys()) 
あなたのコードが動作する

をあなたはlistを明示的に呼び出してバックPythonの2の結果を得ることができます。

エラーが示すように、dict_keysタイプはインデックス作成をサポートしていません。

2

これは、Python 2ではPythonの2と3

間の重大な変更のいずれかです。

のPython 3では
>>> help(dict.keys) 
keys(...) 
    D.keys() -> list of D's keys 

>>> help(dict.keys) 
keys(...) 
    D.keys() -> a set-like object providing a view on D's keys 

この動作の変更は、多くのことを作りますdictは意味的に順序付けされておらず、そのキーはセットと同じようにユニークです。

この変更は、dictのキーとの何らかの種類の比較を実行するたびに、新しいキーのリストを作成する必要がないことを意味します。

のPython 3への移行を支援するために2と3

で同じ動作を取得、Pythonの2.7は、他のdictメソッド、viewkeysを持っています。viewkeys方法は、Python 3のdict.keys方法に最も類似している:Pythonの3では

>>> d 
{'a': None, 'c': None, 'b': None, 'd': None} 
>>> for k in d.viewkeys(): print k 
... 
a 
c 
b 
d 
>>> d.viewkeys() & set('abc') 
set(['a', 'c', 'b']) 

、以前の動作に最も近いアナログはlistdict.keys()を渡すことです:

>>> d 
{'d': None, 'a': None, 'c': None, 'b': None} 
>>> list(d.keys()) 
['d', 'a', 'c', 'b'] 

それともに辞書を渡しますlistと入力します.Dictはそのキーを繰り返し実行します:

>>> list(d) 
['d', 'a', 'c', 'b'] 

if hasattr(dict, 'viewkeys'): # Python 2.7 
    def keys(d): 
     return d.viewkeys() 
else: # Python 3 
    def keys(d): 
     return d.keys() 

とリストフォームを取得するためにlistに辞書を渡すと、2と3の両方で、同じ出力を得るでしょう:2と3の上に抽象的行動にユーティリティ機能をeate

をあなたは単にあなたが直接、次のように行うことができます辞書からキーのリストたい場合
>>> d 
{'b': None, 'a': None, 'c': None, 'd': None} 
>>> keys(d) 
dict_keys(['b', 'a', 'c', 'd']) 
>>> list(d) 
['b', 'a', 'c', 'd'] 
0

b = {"name": "xyz", "class":"abc", "college": "qwert"} 
key_list = list(b) 

KEY_LISTリストなど、すべてのキー名が含まれますが、しかし、これがあれば、キーを繰り返しません。フー複数回。重複したキーは1つとしてカウントされます。

-1

問題が解決される。まず:誰もまだ公式ドキュメントをリンクされていないので、私はそれをやる

>>> b = { 'video':0, 'music':23,"picture":12 } 
>>> random.choice(tuple(b.items())) 
('music', 23) 
>>> random.choice(tuple(b.items())) 
('music', 23) 
>>> random.choice(tuple(b.items())) 
('picture', 12) 
>>> random.choice(tuple(b.items())) 
('video', 0) 
>>> 
+0

答えの詳細(テキストの答えと説明を入力すると、そのような仕組みがあるのはなぜか)+コードを直接的に整形する(SOのためにスタンドを保持する)。 – Tatranskymedved