🐍 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のページを参照してください。

← Python list クイックリファレンス一覧へ戻る