Pythonのfor文でindexを得る方法【enumerate, インクリメント, zip】
目次
Pythonのfor文でindexを得る
Pythonのfor文でリストなどを回しているときに添え字(インデックス)を同時に参照したい時があります。
そういう時はPythonではenumerate()
を使います。
結論を書きますと↓のようなコードになります。
lis = [10, 11, 12, 13] for i, x in enumerate(lis): print(i, x) # 0 10 # 1 11 # 2 12 # 3 13
enumerate()
を使った構造は
for 添え字, 要素 in enumerate(リストなど): pass
になります。
enumerate()
はenumerate
クラスのオブジェクトを生成するクラスです。
この記事ではfor文でインデックスを参照する方法を具体的に解説していきます。
enumerateとは?
enumerate
はイテレーション可能なオブジェクトから連番の添え字を一緒に生成するクラスです。
enumerate
オブジェクト自体は他のオブジェクトに変換可能になっています。
そのため↓のようなコードでリストやタプル、辞書や集合に変換できます。
lis = [10, 11, 12, 13] print(type(enumerate(lis))) # <class 'enumerate'> print(list(enumerate(lis))) # [(0, 10), (1, 11), (2, 12), (3, 13)] print(tuple(enumerate(lis))) # ((0, 10), (1, 11), (2, 12), (3, 13)) print(dict(enumerate(lis))) # {0: 10, 1: 11, 2: 12, 3: 13} print(set(enumerate(lis))) # {(1, 11), (3, 13), (0, 10), (2, 12)}
enumerateで添え字の開始位置を変更する
enumerate()
で添え字の開始点を変更したい場合はstart
に開始点を指定します。
lis = [10, 11, 12, 13] for i, x in enumerate(lis, start=5): print(i, x) # 5 10 # 6 11 # 7 12 # 8 13
↑の場合はenumerate(lis, start=5)
で開始点を5
に設定しています。
生成される添え字は「5, 6, 7, 8, ...」になります。
添え字を手動でインクリメントしていく
enumerate()
を使わない場合は手動で添え字をインクリメントしていきます。
lis = [10, 11, 12, 13] i = 0 for x in lis: print(i, x) i += 1 # 0 10 # 1 11 # 2 12 # 3 13
↑の場合、カウント変数i
が添え字の変数です。
for文の末尾でi
をインクリメントしています。
こうすると要素と一緒に添え字を参照できます。
この方法はシンプルでよく使われます。
しかし、enumerate()
のように要素と添え字が完全に連動しているわけではありません。
つまりインクリメントの位置が間違ってズレたりすればバグになる可能性があります。
そういう意味ではenumerate()
を使った方が安心です。
ですが添え字のカウントアップを2
ずつにしたい場合などはこちらの方法の方が適しています。
lis = [10, 11, 12, 13] i = 0 for x in lis: print(i, x) i += 2 # 0 10 # 2 11 # 4 12 # 6 13
zipを使って添え字とリストを合成する
range()
は指定範囲の数列を生成します。
zip()
は2つのオブジェクトを合成して1つのオブジェクトにします。
これらを使ってrange()
とリストをzip()
で合成すると、複雑な添え字を得ることができます。
for i, x in zip(range(10), [10, 11, 12, 13]): print(i, x) # 0 10 # 1 11 # 2 12 # 3 13 for i, x in zip(range(5, 10), [10, 11, 12, 13]): print(i, x) # 5 10 # 6 11 # 7 12 # 8 13 for i, x in zip(range(10, 0, -1), [10, 11, 12, 13]): print(i, x) # 10 10 # 9 11 # 8 12 # 7 13