Python で zip() 関数を使用する方法 (イテラブルの結合)

Python の zip() 関数を使用して複数の反復可能オブジェクトを並列に結合する方法を学びます。辞書の作成、解凍ロジックをマスターし、長さの不一致を処理します。

エディターでこのソリューションを試してください

概要

データセットを反復処理する場合、多くの場合、複数の関連リストを並行して処理する必要があります。たとえば、ユーザー名のリストとユーザー ID のリストを組み合わせたり、X 値と Y 値の座標を一致させたりします。入れ子になったループや、リストのインデックス付けカウンターを使用して項目にアクセスする代わりに、Python はエレガントな `zip()` 関数を提供します。

`zip(*iterables)` 関数は複数のイテラブルを引数として受け取り、それらを集約して、i 番目のタプルに各入力イテラブルの i 番目の要素が含まれるタプルのイテレータを返します。これにより、単一の `for` ループで 2 つ以上のコレクションを同時に簡単にループできます。

デフォルトでは、`zip()` は、最も短い入力反復可能値が使い尽くされると結合を停止します。より長い反復可能範囲内に残っている要素はすべて破棄されます。最長の反復可能値がなくなるまで要素をペアにして、欠損値をプレースホルダーで埋めたい場合、Python は標準ライブラリの `itertools` モジュールで `zip_longest()` を提供します。

コードと実行の出力

このスクリプトは、リストの並列反復、zip を使用した辞書の作成、zip_longest を使用した不一致の処理を示します。

from itertools import zip_longest

names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]

# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
    print(f"{name} scored {score}")

# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)

# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]

# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))

# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)
端子出力
--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95

Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}

Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]

段階的な実装

  • 結合する複数のリストまたは反復可能オブジェクトを zip() 関数に渡します。
  • 生成されたタプルを for ループ ステートメントで解凍し、クリーンな並列反復を実現します。
  • マッピングに dict(zip(keys_list, value_list)) を使用して、zip オブジェクトを辞書に変換します。
  • itertools.zip_longest をインポートして、末尾の値を失わずに長さの異なるリストを結合します。

よくある質問

zip 形式で圧縮されたタプルのシーケンスを「解凍」するにはどうすればよいですか?

解凍演算子 *: list(zip(*zipped_tuples)) を使用して、シーケンスを個別のリストに解凍できます。

zip() はメモリ内の要素を複製しますか?

いいえ、zip() はオンデマンドで要素を生成する反復子を返すため、非常にメモリ効率が高くなります。

関連トピック

推奨される Python リソース

関連するインタラクティブなチュートリアル、チートシート、コード比較で知識を深めてください。