for row_number, row in enumerate(cursor):
はPythonで何をするのですか?
この文脈でenumerate
はどういう意味ですか?
enumerate()
関数 はイテラブルにカウンタを追加します。
cursor
の各要素に対して、Tupleは(counter, element)
で生成されます。 for
ループはそれをそれぞれrow_number
とrow
にバインドします。
デモ:
>>> 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整数値を使用する整数オブジェクト(無制限).
これは組み込みのジェネレータ関数です。 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番目の引数として指定できます。
私は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)
他のユーザが述べたように、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
関数のように任意のイテラブルに対しては機能しません。
列挙関数は次のように機能します。
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')