🔖
【Python】zip() の使い方・注意点・元に戻す方法を解説
はじめに
Pythonで複数のリストを同時に処理したいときに便利なのが zip() 関数です。
例えば「名前と年齢のリストを一緒に扱いたい」といった場面で、シンプルに書くことができます。
本記事では、zip() の基本的な使い方から、注意点、まとめたデータを元の形に戻す方法(zip(*リスト))や、要素数が合わない場合の対処法まで整理します。
1. zip() の基本的な使い方
複数のイテラブル(リストやタプルなど)を1つにまとめてループ処理できる関数です。
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f'{name} is {age} years old')
出力結果:
Alice is 25 years old
Bob is 30 years old
Charlie is 35 years old
2. zip() の戻り値とリスト化
zip() の戻り値は zipオブジェクト(イテレータ)です。
ループや list() で展開するまで中身は見えません。
zipped = zip(['a', 'b'], [1, 2])
print(zipped) # <zip object at 0x...>
print(list(zipped)) # [('a', 1), ('b', 2)]
3. 要素数が違う場合の注意点
zip() は、もっとも短いリストに合わせて切り詰められます。
names = ['Alice', 'Bob']
ages = [25, 30, 35]
print(list(zip(names, ages))) # [('Alice', 25), ('Bob', 30)]
💡 余った要素は無視されるため、意図した処理になっていないことに気づきにくい点は注意が必要です。
4. zip でまとめた要素を元のリストに戻す(zip(*リスト))
zip() を使って作ったリストを 元の複数のリストに戻すには、
アンパック演算子 * を使って zip() に渡したあと、それぞれを list() に変換します。
pairs = [('a', 1), ('b', 2), ('c', 3)]
letters, numbers = zip(*pairs)
letters = list(letters)
numbers = list(numbers)
print(letters) # ['a', 'b', 'c']
print(numbers) # [1, 2, 3]
💡
zip(*pairs)は、まとめた要素を再び分けて取り出す操作です。
*はリストの中身を1つずつ展開して、zip()に渡しています。
5. zip_longest の使い方
リストの長さが異なる場合でも、すべての要素を取り出したいときは、標準ライブラリ itertools の zip_longest() が便利です。
from itertools import zip_longest
a = ['x', 'y']
b = [1, 2, 3]
result = list(zip_longest(a, b, fillvalue='N/A'))
print(result) # [('x', 1), ('y', 2), ('N/A', 3)]
おわりに
zip() は、複数のリストを並行して処理したいときにとても便利な関数です。
- 長さが異なるリストを
zip()で組み合わせると、短い方に揃えられる - まとめたデータを元に戻したいときは
zip(*リスト)を使う - 足りない要素を補いたいときは
zip_longest()を使う
こうした特徴を押さえておくと、コードの見通しが良くなり、バグも防ぎやすくなります。
本記事が参考になれば幸いです。
Discussion