🐍 Python
zip(*iterables)
複数のリストを、同じ位置の要素同士でペアにまとめる関数です。「名前のリスト」と「年齢のリスト」のように、対応関係のある複数のリストを同時にループしたいときに使います。
構文: zip(*iterables)
戻り値: 各iterableの同じ位置の要素をまとめたタプルのイテレータ
基本の使い方
names = ["Alice", "Bob"]
ages = [30, 25]
pairs = list(zip(names, ages))
print(pairs) # [('Alice', 30), ('Bob', 25)]
長さが違う場合は短い方に合わせられる
複数のリストの長さが違ってもzipはエラーになりません。短い方のリストの長さで打ち切られ、余った要素は無視されます。
a = [1, 2, 3]
b = ["x", "y"]
print(list(zip(a, b))) # [(1, 'x'), (2, 'y')] ← aの3番目は無視される
zip(*...)でアンジップする(逆操作)
*を付けて元のペアのリストを展開すると、逆にペアを分解できます。
pairs2 = [(1, "a"), (2, "b"), (3, "c")]
nums6, letters = zip(*pairs2)
print(nums6, letters) # (1, 2, 3) ('a', 'b', 'c')
実用例:2つのリストから辞書を作る
d = dict(zip(names, ages))
print(d) # {'Alice': 30, 'Bob': 25}
パラメータ
- *iterables
- まとめて処理したい複数のリスト(可変長引数。2個以上いくつでも渡せる)
- 戻り値
- タプルを1つずつ返すイテレータ。リストとして使うには
list()で囲む
💡 AIコードレビュー観点:長さが違うリストを渡していないか事前に確認する
zipは長さの不一致をエラーにせず黙って短い方に合わせるため、「本来同じ長さのはずのリストが、バグでズレて長さが違ってしまっていた」ケースに気づきにくいという弱点があります。AIが生成したコードでzipを使う前に、意図的に長さが違うのか、本当は揃っているべきなのかを確認する価値があります。Python 3.10以降はzip(a, b, strict=True)とすると長さが違う場合にValueErrorで検知できます。
インデックス番号だけが欲しい場合はenumerateのページを参照してください。