ユーニックス総合研究所

  • home
  • archives
  • python-for-index

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

  • 作成日: 2023-01-04
  • 更新日: 2023-12-24
  • カテゴリ: Python

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文でインデックスを参照する方法を具体的に解説していきます。

関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する

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