Pythonのzip関数で複数のイテラブルを同時に操作しよう!

JavaScriptを有効にしてください

前書き

Python には、複数のイテラブル(リスト、タプル、文字列など)を同時に扱える強力な組み込み関数がいくつか存在します。その中でも zip 関数は、各イテラブルの同じインデックス位置にある要素をまとめて扱うことができ、コードの可読性と効率を大幅に向上させます。この記事では、zip 関数の基本的な使い方、実用例、注意点などを詳しく解説していきます。

zip関数とは?

zip 関数は、複数のイテラブルから対応する要素を順番に取り出し、それらをタプルとしてまとめたイテレータを返します。
簡単に言えば、リスト A とリスト B の同じ位置にある要素をペアにしてくれる関数です。

例えば、以下のコードをご覧ください:

python
1
2
3
4
5
names = ["John", "Jane", "Doe"]
ages = [23, 34, 45]

for name, age in zip(names, ages):
    print(f"{name}{age}歳です。")
実行結果
1
2
3
Johnは23歳です。
Janeは34歳です。
Doeは45歳です。

このコードでは、zip(names, ages) が以下のようなタプルを順に生成します:

  • ("John", 23)
  • ("Jane", 34)
  • ("Doe", 45)

それぞれのタプルが for ループ内でアンパックされ、対応する要素が利用されます。

基本的な使い方

複数リストの同時反復処理

zip を使うことで、複数のリストの対応する要素を同時に取り出して処理することができます。たとえば、名前と年齢のリストがある場合、上記の例のようにして両方を同時に処理できます。

イテレータとしての性質

Python 3 以降、zip はイテレータを返します。これは、必要な時に要素を一つずつ生成する「遅延評価」を行うため、メモリ効率が良いという特徴があります。すべての結果が必要な場合は、list(zip(...)) のようにリストに変換することもできます。

python
1
2
3
4
names = ["John", "Jane", "Doe"]
ages = [23, 34, 45]
result = list(zip(names, ages))
print(result)
実行結果
1
[('John', 23), ('Jane', 34), ('Doe', 45)]

実用例

例1: 学生の名前と得点を対応付ける

python
1
2
3
4
5
students = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

for student, score in zip(students, scores):
    print(f"{student}さんの得点は{score}点です。")
実行結果
1
2
3
Aliceさんの得点は85点です。
Bobさんの得点は92点です。
Charlieさんの得点は78点です。

例2: 複数のリストを同時に反復処理

複数のリストを組み合わせて、各リストの同じ位置にある要素同士で何らかの操作を行うことができます。

python
1
2
3
4
5
6
7
products = ["リンゴ", "バナナ", "オレンジ"]
prices = [100, 80, 120]
quantities = [5, 3, 4]

for product, price, quantity in zip(products, prices, quantities):
    total = price * quantity
    print(f"{product}の合計金額は {total} 円です。")
実行結果
1
2
3
リンゴの合計金額は 500 円です。
バナナの合計金額は 240 円です。
オレンジの合計金額は 480 円です。

例3: イテレータの長さが異なる場合

zip 関数は、渡されたイテラブルの中で最も短いものに合わせてループを終了します。たとえば、以下の例では names リストが 3 つの要素を持ち、ages リストが 2 つの要素しかない場合、ループは 2 回で終了します。

python
1
2
3
4
5
names = ["John", "Jane", "Doe"]
ages = [23, 34]

for name, age in zip(names, ages):
    print(f"{name}{age}歳です。")
実行結果
1
2
Johnは23歳です。
Janeは34歳です。

注意点

  • 長さの不一致
    複数のイテラブルの長さが異なる場合、余った要素は無視されます。全ての要素を扱いたい場合は、itertools.zip_longest を利用することを検討してください。
python
1
2
3
4
5
6
7
from itertools import zip_longest

names = ["John", "Jane", "Doe"]
ages = [23, 34]

for name, age in zip_longest(names, ages, fillvalue="不明"):
    print(f"{name}{age}歳です。")
実行結果
1
2
3
Johnは23歳です。
Janeは34歳です。
Doeは不明歳です。
  • イテレータの特性
    zip は一度しか使えないイテレータを返します。同じ組み合わせを再利用したい場合は、リストに変換してから使用してください。

まとめ

zip 関数は、複数のイテラブルを同時に扱いたい場合に非常に便利なツールです。対応する要素を一つずつ取り出してまとめることで、コードがシンプルになり、処理の意図も明確になります。

  • 複数のリストやタプルを同時に反復処理
  • メモリ効率の良いイテレータとして動作
  • イテラブルの長さが異なる場合は最短のものに合わせる

これらの特徴を活かして、より効率的で読みやすいコードを書いてみてください!


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア