プログラミングを行っていると、「名前のリスト」と「年齢のリスト」のように、関連するデータが別々のリストに格納されており、それらを同時に取り出して処理したい場面に遭遇します。
インデックスを使って list1[i]、list2[i] とアクセスすることも可能ですが、Pythonにはよりスマートで可読性の高い方法として、組み込み関数の zip() が用意されています。
この記事では、zip() 関数を使って複数のリストを同時にループ処理する方法と、リストの要素数が異なる場合の挙動について解説します。
1. 基本的な使い方(2つのリスト)
zip() 関数に複数のリスト(またはイテラブル)を引数として渡すと、それぞれのリストの同じインデックスにある要素をまとめたタプルを順次返します。これを for 文でアンパックして受け取ることで、同時にループ処理を行えます。
構文:
for 変数1, 変数2 in zip(リスト1, リスト2):
# 処理
使用例: 商品名のリストと、その価格のリストを同時に処理して表示するプログラムです。
# 商品名のリスト
product_names = ["Apple", "Orange", "Banana"]
# 価格のリスト
product_prices = [150, 200, 120]
print("--- 価格表 ---")
# zip() で2つのリストをまとめる
for name, price in zip(product_names, product_prices):
print(f"商品: {name} | 価格: {price}円")
実行結果:
--- 価格表 ---
商品: Apple | 価格: 150円
商品: Orange | 価格: 200円
商品: Banana | 価格: 120円
2. 3つ以上のリストを同時に処理する
zip() 関数は、3つ以上のリストに対しても同様に使用できます。引数にリストを追加し、for 文の受け取り変数を増やすだけです。
使用例: 従業員の「名前」「ID」「部署」という3つのリストをまとめて処理する例です。
names = ["Tanaka", "Sato", "Suzuki"]
ids = [101, 102, 103]
departments = ["Sales", "Engineering", "HR"]
print("--- 従業員データ ---")
for name, emp_id, dept in zip(names, ids, departments):
print(f"ID: {emp_id}, Name: {name}, Dept: {dept}")
実行結果:
--- 従業員データ ---
ID: 101, Name: Tanaka, Dept: Sales
ID: 102, Name: Sato, Dept: Engineering
ID: 103, Name: Suzuki, Dept: HR
3. リストの要素数が異なる場合の挙動(重要)
zip() 関数を使う上で最も注意すべき点は、渡されたリストの長さ(要素数)が異なる場合の挙動です。
zip() は、最も短いリストの要素が尽きた時点でループを終了します。つまり、長いリストの余った要素は**無視(切り捨て)**されます。
# 長さが異なるリスト
list_short = ["A", "B"]
list_long = [1, 2, 3, 4, 5]
print("--- ループ開始 ---")
for char, num in zip(list_short, list_long):
print(f"{char} - {num}")
print("--- ループ終了 ---")
実行結果:
--- ループ開始 ---
A - 1
B - 2
--- ループ終了 ---
list_short の要素がなくなった時点でループが止まり、list_long の 3, 4, 5 は処理されませんでした。
この挙動は、意図している場合は便利ですが、データ欠損に気づかないバグの原因にもなり得ます。
4. 要素数が異なる場合にエラーを出す (strict=True)
もし「リストの長さは必ず同じはずだ」という前提があり、長さが異なるときにはエラーとして検知したい場合は、zip() 関数に strict=True オプションを指定します(Python 3.10以降で使用可能)。
list_short = ["A", "B"]
list_long = [1, 2, 3]
# strict=True を指定すると、長さが不一致の場合に ValueError が発生する
# for char, num in zip(list_short, list_long, strict=True):
# print(f"{char} - {num}")
# 実行結果:
# ValueError: zip() argument 2 is longer than argument 1
これにより、予期せぬデータの不整合を即座に発見できます。
まとめ
- 複数のリストを同時にループ処理するには
zip()関数を使用します。 for a, b in zip(list_a, list_b):のように記述します。- 3つ以上のリストも同時に処理可能です。
- リストの要素数が異なる場合、
zip()は最短のリストに合わせて終了し、残りは無視されます。 - データの整合性を保ちたい場合は、
strict=Trueオプションの利用を検討してください。
