171

インデックスで dict_key の要素にアクセスしようとしています:

test = {'foo': 'bar', 'hello': 'world'}
keys = test.keys()  # dict_keys object

keys.index(0)
AttributeError: 'dict_keys' object has no attribute 'index'

私は取得したいfoo

と同じ:

keys[0]
TypeError: 'dict_keys' object does not support indexing

これどうやってするの?

4

6 に答える 6

239

list()代わりに辞書を呼び出します。

keys = list(test)

Python 3 では、このdict.keys()メソッドはセットとして機能するディクショナリ ビュー オブジェクトを返します。辞書を直接反復処理してもキーが生成されるため、辞書をリストに変換すると、すべてのキーのリストが生成されます。

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'
于 2013-08-31T19:33:10.787 に答える
72

完全な答えではありませんが、おそらく役立つヒントです。それが本当にあなたが欲しい最初のアイテムなら*、

next(iter(q))

よりもはるかに高速です

list(q)[0]

全体をメモリに保存する必要がないため、大きな辞書の場合。

10.000.000 アイテムの場合、ほぼ 40.000 倍高速であることがわかりました。

* Python 3.6より前では、dict が単なる疑似ランダム項目である場合の最初の項目(その後は、標準実装で順序付けられますが、それに依存することはお勧めしません)。

于 2014-12-24T14:59:20.367 に答える
6

最初の辞書項目の「キー」と「値」のペアが必要でした。次のコードを使用しました。

 key, val = next(iter(my_dict.items()))
于 2020-03-29T19:30:22.510 に答える
0

多くの場合、これはXY 問題である可能性があります。辞書のキーを位置でインデックス付けするのはなぜですか? 本当に必要ですか?最近まで、辞書は Python で順序付けさえされていなかったため、最初の要素へのアクセスは任意でした。

Python 2 コードの一部を Python 3 に翻訳しました。

keys = d.keys()
for (i, res) in enumerate(some_list):
    k = keys[i]
    # ...

これはきれいではありませんが、それほど悪くもありません。最初は、怪物に置き換えようとしていました

    k = next(itertools.islice(iter(keys), i, None))

これが次のように書かれた方がはるかに優れていることに気付く前に

for (k, res) in zip(d.keys(), some_list):

これは問題なく動作します。

他の多くの場合、位置による辞書キーのインデックス付けは回避できると思います。辞書は Python 3.7 で順序付けされていますが、それに依存するのは適切ではありません。上記のコードは、 のコンテンツがsome_listのコンテンツから最近生成されたためにのみ機能しdます。

disk_keys要素にインデックスでアクセスする必要がある場合は、コードをよく見てください。おそらく、その必要はありません。

于 2019-05-29T12:31:57.913 に答える