web-dev-qa-db-ja.com

Enumerate()はどういう意味ですか?

for row_number, row in enumerate(cursor):はPythonで何をするのですか?

この文脈でenumerateはどういう意味ですか?

281
user3374098

enumerate()関数 はイテラブルにカウンタを追加します。

cursorの各要素に対して、Tupleは(counter, element)で生成されます。 forループはそれをそれぞれrow_numberrowにバインドします。

デモ:

>>> elements = ('foo', 'bar', 'baz')
>>> for elem in elements:
...     print elem
... 
foo
bar
baz
>>> for count, elem in enumerate(elements):
...     print count, elem
... 
0 foo
1 bar
2 baz

デフォルトでは、enumerate()0からカウントを始めますが、2番目の整数引数を指定した場合は、代わりにその番号から開始します。

>>> for count, elem in enumerate(elements, 42):
...     print count, elem
... 
42 foo
43 bar
44 baz

Pythonでenumerate()を再実装するのであれば、これを実現する2つの方法があります。一方は itertools.count() を使用してカウントを行い、もう一方は手動で generator関数を使用してカウントします

from itertools import count

def enumerate(it, start=0):
    # return an iterator that adds a counter to each element of it
    return Zip(count(start), it)

そして

def enumerate(it, start=0):
    count = start
    for elem in it:
        yield (count, elem)
        count += 1

実際のC の実装は後者に近く、一般的なfor i, ...アンパックの場合は単一のTupleオブジェクトを再利用し、Pythonの使用を避けるにはカウンタが大きくなりすぎるまでカウンタに標準のC整数値を使用する整数オブジェクト(無制限).

464
Martijn Pieters

これは組み込みのジェネレータ関数です。 http://docs.python.org/2/library/functions.html#enumerate を参照してください。

つまり、イテレータの要素とインデックス番号が得られます。

for item in enumerate(["a", "b", "c"]):
    print item

版画

(0, "a")
(1, "b")
(2, "c")

もしあなたがインテレータをループしたい、そしてインデックスカウンタを利用可能にしたいなら、それは役に立ちます。カウンタを他の値(通常1)から開始したい場合は、それをenumerateの2番目の引数として指定できます。

85
RemcoGerlich

私はBrett Slatkinによる本( 'Effective Python' )を読んでいます、そして彼はリストを反復処理してリストの現在の項目のインデックスを知る別の方法を示しています。しかし、それを使用せず、代わりにenumerateを使用することをお勧めします。私はあなたが列挙の意味を尋ねたことを知っていますが、私が以下を理解したとき、私はenumerateがどのように現在のアイテムのインデックスをより簡単に(そしてもっと読みやすく)知っている間反復するのを理解しました。

list_of_letters = ['a', 'b', 'c']
for i in range(len(list_of_letters)):
    letter = list_of_letters[i]
    print (i, letter)

出力は以下のとおりです。

0 a
1 b
2 c

私はenumerate関数について読む前に何かをしていました。

i = 0
for n in list_of_letters:
    print (i, n)
    i = i +1

同じ出力が生成されます。

しかしenumerateを使えば、私はただ書く必要があります:

list_of_letters = ['a', 'b', 'c']
for i, letter in enumerate(list_of_letters):
    print (i, letter)
18
Dora

他のユーザが述べたように、enumerateはイテラブルの各項目の隣に増分インデックスを追加するジェネレータです。

l = ["test_1", "test_2", "test_3"]というリストがある場合、list(enumerate(l))[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]のようになります。

今、これが便利なときは? 使用可能なケースとしては、アイテムを繰り返し処理し、特定のアイテムをスキップしたいときに、リスト内のインデックスのみを認識し、値を認識しないようにします(その時点では値はわかりません)。

for index, value in enumerate(joint_values):
   if index == 3:
       continue

   # Do something with the other `value`

rangeを使用して通常のforループを実行することもできますが、その場合はインデックスを付ける必要がある項目にアクセスする必要があります(つまり、joint_values[i])ので、コードはより読みやすくなります。

別のユーザーがenumerateを使ったZipの実装について言及しましたが、itertoolsを使わないより純粋な(しかしもう少し複雑な)方法は次のようになると思います:

def enumerate(l, start=0):
    return Zip(range(start, len(l) + start), l)

例:

l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)

出力:

[(0、 'test_1')、(1、 'test_2')、(2、 'test_3')]

[(10、 'test_1')、(11、 'test_2')、(12、 'test_3')]

コメントで述べたように、rangeを使ったこのアプローチは、元のenumerate関数のように任意のイテラブルに対しては機能しません。

13
Rafael

列挙関数は次のように機能します。

doc = """I like movie. But I don't like the cast. The story is very Nice"""
doc1 = doc.split('.')
for i in enumerate(doc1):
     print(i)

出力は

(0, 'I like movie')
(1, " But I don't like the cast")
(2, ' The story is very Nice')
10