Pythonのzip関数は、複数のリストやイテラブルを同時に処理するときに非常に便利です。競技プログラミングにおいても、以下のようなパターンで活用できます。
複数のリストの要素をペアリングして同時に処理
2つのリスト(またはそれ以上)を要素ごとに対応付けて処理する場合に便利です。
例題:
2つのリスト A と B が与えられ、それぞれのペアの和を計算せよ。
A = [1, 2, 3]
B = [4, 5, 6]
result = [a + b for a, b in zip(A, B)]
print(result) # 出力: [5, 7, 9]
ソート時にインデックスを保持
enumerateとzipを組み合わせて、値とインデックスを同時に操作するパターン。
例題:
リストをインデックスを保持したままソートせよ。
A = [3, 1, 4, 1, 5]
# zipでインデックスと値をペアにしてソート
indexed_A = list(zip(range(len(A)), A))
sorted_with_index = sorted(indexed_A, key=lambda x: x[1])
for idx, value in sorted_with_index:
print(f"Index: {idx}, Value: {value}")
# 出力:
# Index: 1, Value: 1
# Index: 3, Value: 1
# Index: 0, Value: 3
# Index: 2, Value: 4
# Index: 4, Value: 5
リストの転置
行列の転置や、入力形式の変換で役立つパターン。
例題:
2次元リストを転置せよ。
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = list(map(list, zip(*matrix)))
print(transposed)
# 出力:
# [
# [1, 4, 7],
# [2, 5, 8],
# [3, 6, 9]
# ]
複数のリストを辞書に変換
キーと値のリストから辞書を作成するパターン。
例題:
キーと値のリストが与えられる。辞書を作成せよ。
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']
dictionary = dict(zip(keys, values))
print(dictionary) # 出力: {'name': 'Alice', 'age': 25, 'city': 'New York'}
条件付きペアのフィルタリング
2つのリストの対応する要素を条件でフィルタリングするパターン。
例題:
リスト A と B の対応する要素のペアで、和が偶数になるものを選べ。
A = [1, 2, 3, 4]
B = [5, 6, 7, 8]
filtered_pairs = [(a, b) for a, b in zip(A, B) if (a + b) % 2 == 0]
print(filtered_pairs) # 出力: [(1, 5), (3, 7)]
差分計算
隣接する要素の差分を計算するパターン。
例題:
リストの隣接する要素の差分を計算せよ。
A = [10, 20, 15, 30]
differences = [b - a for a, b in zip(A, A[1:])]
print(differences) # 出力: [10, -5, 15]
一致するインデックスの抽出
複数のリストで対応する要素が条件を満たすインデックスを取得するパターン。
例題:
リスト A と B の対応する要素が同じ値であるインデックスを取得せよ。
A = [1, 2, 3, 4]
B = [1, 3, 3, 5]
matching_indices = [i for i, (a, b) in enumerate(zip(A, B)) if a == b]
print(matching_indices) # 出力: [0, 2]
まとめ
これらのパターンは、zip関数を活用することで、競技プログラミングの効率化に直結します。zip関数を使いこなせば、コードの可読性と簡潔さが向上し、パフォーマンスを損なうことなく多くの問題を解くことができます。