Pythonのenumerate関数zip関数をfor文と組み合わせると、ループ処理が格段に便利になります。

通常のfor文やrange関数だけでは少し面倒な「インデックス番号の取得」や「複数リストの同時ループ」も、これらの関数を使えばスッキリ書けます。

この記事では、Pythonのenumerate関数zip関数をfor文のin演算子と組み合わせる方法を、豊富なコード例とともに丁寧に解説します。

対象者はfor文の基本が理解できている方を推奨しますが、初心者の方でも理解できるよう丁寧に説明しますのでご安心ください。

for文の基本についてはこちらの記事も参考にしてください。
Pythonのfor文の使い方を徹底解説

for文とin演算子の基本おさらい

まずは、for文の基本であるin演算子を使った処理を確認しましょう。enumerate関数・zip関数を理解する前提として押さえておきたいポイントです。

data = ['りんご', 'すいか', 'めろん']

for i in data:
    print(i)

上の例では、リストdataに3つの要素が入っています。for~inで一つずつ取り出してprintしています。

りんご
すいか
めろん

in演算子を使うことで、リストから要素を順に取り出す処理が簡単にできますね。では、これを元に関数と組み合わせた処理を見ていきましょう。

enumerate関数とは?for文での基本的な使い方

enumerate関数は、リストなどのイテラブルオブジェクトをループする際に、インデックス番号(何番目か)と値を同時に取得できる便利な組み込み関数です。

通常のfor文だけではインデックスを別途カウントする必要がありますが、enumerate関数を使えば一行でスッキリ書けます。

enumerate関数の基本構文

for インデックス変数, 値変数 in enumerate(イテラブル):
    処理

enumerate関数の基本例

リストfruitsの中から要素を順に取り出す際、インデックスを付けてprintしてみます。

fruits = ['りんご', 'すいか', 'めろん']

for index, fruit in enumerate(fruits):
    print(index, ':', fruit)

このように、for文で値を取り出す際に値とインデックス番号を同時に取得しながらループできます。

0 : りんご
1 : すいか
2 : めろん

enumerate関数の第二引数でインデックスの開始番号を指定する

デフォルトではインデックスは0から始まりますが、第二引数に開始番号を指定することができます。

fruits = ['りんご', 'すいか', 'めろん']

for index, fruit in enumerate(fruits, 1):
    print(index, '番目は', fruit, 'です')

enumerate(fruits, 1)と書くことで、人間にとって自然な「1番目」「2番目」…という表現が可能になります。

1 番目は りんご です
2 番目は すいか です
3 番目は めろん です

enumerate関数とif文を組み合わせた実用例

enumerate関数をif文と組み合わせることで、リスト内の特定の値とその位置を検索する処理が可能になります。

fruits = ['りんご', 'すいか', 'めろん']
search_fruit = 'すいか'

for index, fruit in enumerate(fruits, 1):
    if fruit == search_fruit:
        print(f'「{search_fruit}」は{index}番目です')

変数search_fruitに代入した「すいか」をリストから探し、何番目にあるかを出力します。

「すいか」は2番目です

enumerate関数を使うことで、インデックス番号のカウント変数を別途用意する必要がなく、コードがシンプルになります。

zip関数とは?for文での基本的な使い方

zip関数は、複数のリスト(イテラブル)を同時にループ処理するときに使う組み込み関数です。複数のリストから対応する要素を一度に取り出せるため、並列処理が非常に簡潔に書けます。

zip関数の基本構文

for 変数1, 変数2 in zip(リスト1, リスト2):
    処理

zip関数の基本例

果物の名前と価格を別々のリストに持っている場合を例に見てみましょう。

fruits = ['りんご', 'すいか', 'めろん']
prices = [200, 800, 1500]

for fruit, price in zip(fruits, prices):
    print(f'{fruit}の値段は{price}円です')

zip関数を使うことで、2つのリストの対応する要素を同時に取り出してループできます。

りんごの値段は200円です
すいかの値段は800円です
めろんの値段は1500円です

zip関数で3つ以上のリストを同時にループする

zip関数は2つだけでなく、3つ以上のリストにも対応しています。

fruits  = ['りんご', 'すいか', 'めろん']
prices  = [200, 800, 1500]
colors  = ['赤', '緑', '黄緑']

for fruit, price, color in zip(fruits, prices, colors):
    print(f'{color}の{fruit}は{price}円です')
赤のりんごは200円です
緑のすいかは800円です
黄緑のめろんは1500円です

複数のリストを同時に扱う場合、zip関数を使うとコードが非常にスッキリします。

zip関数のリスト長が異なる場合の注意点

zip関数は、要素数が最も少ないリストに合わせてループが終了します。要素数の異なるリストを扱う場合は注意が必要です。

fruits = ['りんご', 'すいか', 'めろん', 'ぶどう']  # 4要素
prices = [200, 800, 1500]                          # 3要素

for fruit, price in zip(fruits, prices):
    print(f'{fruit}: {price}円')
りんご: 200円
すいか: 800円
めろん: 1500円
# ぶどうは出力されない

すべての要素をループしたい場合は、itertools.zip_longest()を使う方法もあります。

enumerate関数とzip関数を組み合わせる方法

ここからが本記事のメインテーマです。enumerate関数とzip関数を組み合わせることで、「インデックス付き」かつ「複数リストの同時ループ」が一度に実現できます。

enumerate関数とzip関数を組み合わせた基本例

zip関数で複数リストをまとめ、さらにenumerate関数でインデックスを付ける方法です。

fruits = ['りんご', 'すいか', 'めろん']
prices = [200, 800, 1500]

for index, (fruit, price) in enumerate(zip(fruits, prices), 1):
    print(f'{index}番目: {fruit} → {price}円')

ポイントはenumerate(zip(fruits, prices), 1)という書き方です。zip関数でまとめたタプルをenumerate関数に渡しています。

1番目: りんご → 200円
2番目: すいか → 800円
3番目: めろん → 1500円

enumerate関数とzip関数を組み合わせた実用例

もう少し実用的な例として、点数リストから合格・不合格を判定しながら順位付きで出力する処理を作ってみましょう。

names   = ['田中', '鈴木', '佐藤']
scores  = [85, 42, 91]
passing = 60  # 合格点

for rank, (name, score) in enumerate(zip(names, scores), 1):
    result = '合格' if score >= passing else '不合格'
    print(f'{rank}番: {name}さん → {score}点 ({result})')
1番: 田中さん → 85点 (合格)
2番: 鈴木さん → 42点 (不合格)
3番: 佐藤さん → 91点 (合格)

enumerate関数とzip関数を組み合わせることで、複雑に見える処理もシンプルなコードで表現できます。

enumerate関数・zip関数のよくある質問

Q. enumerate関数はリスト以外にも使えますか?

はい、タプル・文字列・辞書のキーなど、イテラブルなオブジェクトであればすべてenumerate関数を使えます

# 文字列にenumerate関数を使う例
word = 'Python'

for index, char in enumerate(word, 1):
    print(f'{index}文字目: {char}')
1文字目: P
2文字目: y
3文字目: t
4文字目: h
5文字目: o
6文字目: n

Q. zip関数の結果をリストに変換したい場合は?

zip関数はイテレータを返すため、list()でリストに変換できます。

fruits = ['りんご', 'すいか', 'めろん']
prices = [200, 800, 1500]

zipped_list = list(zip(fruits, prices))
print(zipped_list)
[('りんご', 200), ('すいか', 800), ('めろん', 1500)]

まとめ:enumerate関数とzip関数でfor文をもっと便利に

この記事では、Pythonのfor文で使えるenumerate関数zip関数の使い方と、それらを組み合わせる方法を解説しました。

  • enumerate関数:ループ中にインデックス番号と値を同時に取得できる。第二引数で開始番号を変更可能。
  • zip関数:複数のリストを同時にループ処理できる。3つ以上のリストにも対応。
  • 組み合わせenumerate(zip(...))の形で、インデックス付き・複数リスト同時ループが一度に実現できる。

これらの関数をマスターするだけで、Pythonのfor文の表現力が大幅にアップします。ぜひ実際にコードを書いて試してみてください。

Pythonのfor文の基礎や他のループ処理については、以下の関連記事も参考にしてください。
Pythonのfor文の使い方を徹底解説

📚 関連記事