zip()関数はPythonの組み込み関数の1つで、複数のイテラブル(リストやタプルなど)の要素を1つずつ取り出して、タプルにまとめる処理を行います。

zip()関数の基本的な使い方

numbers = [1, 2, 3]
letters = ['a', 'b', 'c']
zipped = zip(numbers, letters)
print(list(zipped))  # [(1, 'a'), (2, 'b'), (3, 'c')]

zip()関数は以下のような特徴があります:

  • 複数のイテラブルを同時に処理できる
  • 返り値はzipオブジェクト(イテレータ)
  • 最短のイテラブルの長さに合わせて処理が終了する

よくある使用例

1. 複数リストの同時ループ処理

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

for name, age in zip(names, ages):
    print(f'{name} is {age} years old')

2. 辞書の作成

keys = ['name', 'age', 'city']
values = ['John', 28, 'New York']
my_dict = dict(zip(keys, values))
print(my_dict)  # {'name': 'John', 'age': 28, 'city': 'New York'}

3. 行列の転置

matrix = [[1, 2, 3],
          [4, 5, 6]]
transposed = list(zip(*matrix))
print(transposed)  # [(1, 4), (2, 5), (3, 6)]

注意点

1. 長さの異なるイテラブルを扱う場合

list1 = [1, 2, 3, 4]
list2 = ['a', 'b']
print(list(zip(list1, list2)))  # [(1, 'a'), (2, 'b')]

最短のイテラブルの長さに合わせて処理されるため、余分な要素は無視されます。

2. zipオブジェクトは一度しか使えない

zipped = zip([1, 2], ['a', 'b'])
print(list(zipped))  # [(1, 'a'), (2, 'b')]
print(list(zipped))  # []  # 2回目は空のリストになる

応用テクニック

1. zip_longest()の使用

itertools.zip_longest()を使用すると、最長のイテラブルに合わせて処理できます:

from itertools import zip_longest

list1 = [1, 2, 3]
list2 = ['a', 'b']
result = list(zip_longest(list1, list2, fillvalue=None))
print(result)  # [(1, 'a'), (2, 'b'), (3, None)]

2. unzipの実装

zipped = [(1, 'a'), (2, 'b'), (3, 'c')]
numbers, letters = zip(*zipped)
print(numbers)  # (1, 2, 3)
print(letters)  # ('a', 'b', 'c')

まとめ

zip()関数は複数のイテラブルを効率的に処理するための強力なツールです。以下のような場面で特に有用です:

  • 複数のリストを同時にループ処理する
  • 辞書を作成する
  • データの構造を変換する

適切に使用することで、コードをより簡潔で読みやすくすることができます。