Pythonの辞書のenumerate()


85

enumerateリストの反復に使用することは知っていますが、辞書で試しましたが、エラーは発生しませんでした。

コード:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}

for i, j in enumerate(enumm):
    print(i, j)

出力:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

誰かが出力を説明できますか?


2
for i, j in enumerate(enumm)i反復ごとにインクリメントさjれ、enumerate関数の引数(この場合は辞書)から通常の項目をキャッチします。dictを反復処理することは、基本的にそのキーを反復処理することです。
DivyanshuSrivastava19年

回答:


120

すでに提供されている回答に加えて、Pythonには非常に優れたパターンがあり、辞書のキーと値の両方を列挙できます。

辞書のキー列挙する通常の場合:

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}

for i, k in enumerate(example_dict):
    print(i, k)

どの出力:

0 1
1 2
2 3
3 4

ただし、キーと値の両方列挙する場合は、次のようにします。

for i, (k, v) in enumerate(example_dict.items()):
    print(i, k, v)

どの出力:

0 1 a
1 2 b
2 3 c
3 4 d

1
(+1)単純にdictionary.items()(列挙せずに)使用して、タプルのリストとしてキーと値のペアを持つビューオブジェクトを取得することもできます。
Tiago MartinsPeres李大仁

62

出力の最初の列はの各項目のインデックスでenummあり、2番目の列はそのキーです。辞書を繰り返し処理する場合は、.items()を使用します。

for k, v in enumm.items():
    print(k, v)

そして、出力は次のようになります。

0 1
1 2
2 3
4 4 
5 5
6 6
7 7

33

追加したいと思ったのですが、辞書のインデックス、キー、値を列挙したい場合、forループは次のようになります。

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)

3
この質問は、構文の問題に関連し、この答えは2つの追加の括弧の最短ソリューションを提供している:idx, (k, v) in enumerate(d.items()):
ショーンPianka

1
こんにちはショーン、あなたが答えに同意するのか、それとも単に変数名が短いほど良い答えになると言っているのかわかりませんか?
ジョーダンマッキー

26
dict1={'a':1, 'b':'banana'}

Python 2.xで辞書を一覧表示するには:

for k,v in dict1.iteritems():
        print k,v 

Python 3.xでは、次を使用します。

for k,v in dict1.items():
        print(k,v)
# a 1
# b banana

最後に、他の人が示しているように、実行中のインデックスが必要な場合は、それも使用できます。

for i  in enumerate(dict1.items()):
   print(i)  

 # (0, ('a', 1))
 # (1, ('b', 'banana'))

しかし、これは、電話帳スタイルのルックアップのための効率的なデータ構造である辞書(マップ、連想配列)の目的を 無効にします。辞書の順序は実装に付随する可能性があるため、信頼しないでください。注文が必要な場合は、代わりにOrderedDictを使用して ください


2
この投稿で2文字の編集を行うことはできませんが、OPはこれをPython 3用としてタグ付けしているため、printステートメントではk、vを括弧で囲む必要があります。
wp-overwatch.com 2016年

@氏。私、ty、修正します。
roadrunner66 2016年

19
これは、python2でのみ使用できることに注意してください。dict.iteritemsは()のpython3で除去し、参照もstackoverflow.com/questions/30418481/...
gyger

1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz

Ty。python3とpython2を更新しました。列挙に関するコメントを追加しました。
roadrunner 6620

5

enumerateしたがって、使用しているので、i実際にはキー自体ではなく、キーのインデックスになります。

したがって、キーがない場合でも3、行の最初の列に移動し3 4ます3

enumerate 現在の反復回数も提供しながら、データ構造(リストまたはディクショナリ)を反復処理します。

したがって、ここでの列は、イテレーション番号とそれに続く辞書のキーです。 enum

その他のソリューションでは、キーと値のペアを反復処理する方法がすでに示されているため、同じことを繰り返すことはしません。


4

enumerate()リストで作業するとき、実際にはリスト内のアイテムのインデックスと値を提供します。例えば:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
    print(i, j)

与える

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

ここで、最初の列はアイテムのインデックスを示し、2番目の列はアイテム自体を示します。

辞書で

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
    print(i, j)

それは出力を与えます

0 0
1 1
2 2
3 4
4 5
5 6
6 7

ここで、最初の列はkey:valueペアのインデックスを示し、2番目の列はkeys辞書のインデックスを示しenummます。

したがって、最初の列をkeysとしてvalues、2番目の列をとして使用する場合は、dict.iteritems()(Python 2)またはdict.items()(Python 3)を試してみてください。

for i, j in enumm.items():
    print(i, j)

出力

0 1
1 2
2 3
4 4
5 5
6 6
7 7

出来上がり


1
これは辞書には当てはまりません。コードは、インデックス(反復用)を使用してディクショナリを反復処理しますが、ディクショナリのキーと値の組み合わせは提供しません。代わりにdict.items()を使用してください。
マティアス

はい、dict.items()を使用することもできます。訂正していただきありがとうございます。
Abhishek Roy

3

それは確かに紛らわしいように思われるに違いありません。だからこれが起こっていることです。enumerateの最初の値(この場合はi)は、0から始まる次のインデックス値を返すため、0、1、2、3、...ディクショナリの内容に関係なく、常にこれらの数値を返します。enumerateの2番目の値(この場合はj)は、辞書/列挙型(Pythonでは辞書と呼びます)の値を返します。あなたが本当にやりたいのは、roadrunner66が応答したことです。


3
  1. Python dictを反復処理するということは、とまったく同じ方法でそのキーを反復処理することを意味します。 dict.keys()
  2. キーの順序は実装コードによって決定され、特定の順序を期待することはできません。

    キーと値は、ランダムではなく、Pythonの実装によって異なり、辞書の挿入と削除の履歴に応じて、任意の順序で繰り返されます。キー、値、およびアイテムのビューがディクショナリに介入する変更なしで繰り返される場合、アイテムの順序は直接対応します。

そのため、最初の列に0から7のインデックスが表示されます。それらはによって生成されenumerate、常に正しい順序になっています。さらに、2番目の列にdictのキー0から7が表示されます。それらはソートされていません。


3

Python3:

1つの解決策:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
    print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

別の例:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
     2 : {'a': 10, 'b' : 20, 'c' : 30}
    }    
for i, k in enumerate(d):
        print("{}) key={}, value={}".format(i, k, d[k])

Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}

1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

print("List of enumerated d= ", list(enumerate(d.items())))

出力:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]

0

キー内にインデックスを含めると便利な場合があります。

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

出力:

{(0, 'a'): True, (1, 'b'): False}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.