Python の `zip()` 関数は、複数のイテラブル(リストやタプルなど)を要素ごとに組み合わせて処理できる便利な関数です。この記事では、`zip()` 関数の基本的な使い方から応用例まで、実践的なコードとともに解説します。

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

`zip()` 関数は、複数のイテラブルの要素を1つずつ取り出し、タプルにまとめて返します。

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

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

`zip()` は最も短いイテラブルの長さに合わせて処理を終了します。

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

zip()関数の実践的な使用例

1. 辞書の作成

キーと値のリストから辞書を作成する場合に便利です。

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

2. 行列の転置

2次元リストの行と列を入れ替えることができます。

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

3. 複数のリストを同時にループ処理

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 30, 35]
cities = ['London', 'Paris', 'Tokyo']

for name, age, city in zip(names, ages, cities):
    print(f"{name} is {age} years old and lives in {city}")

zip_longest()を使用した場合

`itertools.zip_longest()` を使用すると、最も長いイテラブルに合わせて処理を行えます。

from itertools import zip_longest

list1 = [1, 2, 3, 4]
list2 = ['a', 'b', 'c']
result = list(zip_longest(list1, list2, fillvalue='N/A'))
print(result)  # [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'N/A')]

zip()関数の注意点

1. メモリ効率:`zip()` はイテレータを返すため、必要に応じて `list()` などに変換する必要があります。

2. 一度使用したzip オブジェクトは再利用できません:

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

まとめ

`zip()` 関数は、複数のイテラブルを効率的に処理するための強力なツールです。特に以下の用途で活用できます:

  • 複数のリストを同時にループ処理
  • 辞書の作成
  • 行列の転置
  • データの組み合わせ

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