Pythonのfor文でindexを得る方法【enumerate, インクリメント, zip】

617, 2023-01-05

目次

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


この記事のアンケートを送信する