Python zip関数を徹底解説!複数のイテラブルをまとめて扱う魔法の関数
Pythonプログラミングで複数のリストやタプルを同時に扱いたいと思ったことはありませんか?そんな時に大活躍するのが、Pythonの**zip
関数**です。zip
関数は、複数のイテラブル(リスト、タプル、文字列など)の要素を効率的に結合し、ペアとして処理することを可能にする強力な組み込み関数です。
この記事では、zip
関数の基本的な使い方から、知っておくと便利な応用例までを徹底的に解説します。あなたのPythonコードをより簡潔でPythonicにするための知識を身につけましょう。
zip
関数とは?なぜ便利なのか
zip
関数は、引数として与えられた複数のイテラブルから、対応する位置の要素を1つずつ取り出し、それらをまとめたタプルを要素とするイテレータを返します。
なぜ便利なのか?
複数データの同時処理: 関連する複数のデータを同時に処理する際に、コードを簡潔に書くことができます。
ループの簡素化: 複数のインデックスを管理する必要がなくなり、可読性が向上します。
辞書作成の効率化: 2つのリストから辞書を効率的に作成できます。
zip
関数の基本的な使い方
zip
関数の最も基本的な使い方は、複数のリストを組み合わせてループ処理を行うことです。
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f"{name}は{age}歳です。")
# 出力:
# Aliceは25歳です。
# Bobは30歳です。
# Charlieは35歳です。
この例では、names
とages
という2つのリストがzip
関数によって結合され、ループ内でそれぞれの要素が同時にname
とage
に割り当てられています。
zip
関数の戻り値と特徴
zip
関数はイテレータを返します。そのため、一度イテレータを使い切ると、再度要素にアクセスするにはzip
関数を呼び出し直す必要があります。リストやタプルに変換して永続化することも可能です。
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = zip(list1, list2)
print(list(zipped)) # [(1, 'a'), (2, 'b'), (3, 'c')]
# zipped は空になるため、もう一度変換しても何も得られない
print(list(zipped)) # []
要素数が異なる場合のzip
関数
zip
関数に渡すイテラブルの要素数が異なる場合、最も短いイテラブルの長さに合わせて結合が停止します。
names = ["Alice", "Bob", "Charlie"]
scores = [90, 85] # scoresの要素数が少ない
for name, score in zip(names, scores):
print(f"{name}のスコアは{score}点です。")
# 出力:
# Aliceのスコアは90点です。
# Bobのスコアは85点です。
# (Charlieは結合されない)
もし、長い方のイテラブルの要素もすべて処理したい場合は、itertools.zip_longest
関数を使用します。これは、短い方のイテラブルにはfillvalue
(デフォルトはNone
)を埋めて結合します。
from itertools import zip_longest
names = ["Alice", "Bob", "Charlie"]
scores = [90, 85]
for name, score in zip_longest(names, scores, fillvalue="N/A"):
print(f"{name}のスコアは{score}点です。")
# 出力:
# Aliceのスコアは90点です。
# Bobのスコアは85点です。
# CharlieのスコアはN/A点です。
zip
関数の応用例
1. 2つのリストから辞書を作成する
zip
関数は、キーとなるリストと値となるリストから辞書を効率的に作成するのに非常に便利です。
keys = ["name", "age", "city"]
values = ["John", 30, "New York"]
person_dict = dict(zip(keys, values))
print(person_dict) # {'name': 'John', 'age': 30, 'city': 'New York'}
2. アンジップ(unzip)する
*
演算子(アンパック演算子)とzip
関数を組み合わせることで、zip
で結合されたものを元に戻す、いわゆる「アンジップ」を行うことができます。
data = [('Alice', 25), ('Bob', 30), ('Charlie', 35)]
names, ages = zip(*data)
print(names) # ('Alice', 'Bob', 'Charlie')
print(ages) # (25, 30, 35)
これは、データがタプルのリストとして与えられた場合に、それぞれの要素を別々のリスト(またはタプル)として取り出したいときに非常に役立ちます。
3. 複数のイテラブルを同時にソートする
複数の関連するリストを、一方のリストのキーに基づいてソートしたい場合にもzip
関数が使えます。
names = ["Charlie", "Alice", "Bob"]
scores = [70, 90, 80]
# 名前とスコアを結合し、名前でソート
sorted_data = sorted(zip(names, scores))
print(sorted_data) # [('Alice', 90), ('Bob', 80), ('Charlie', 70)]
# 必要であればアンジップ
sorted_names, sorted_scores = zip(*sorted_data)
print(sorted_names) # ('Alice', 'Bob', 'Charlie')
print(sorted_scores) # (90, 80, 70)
まとめ
Pythonのzip
関数は、複数のイテラブルを効率的に結合し、同時に処理するための強力で便利なツールです。リスト、タプル、文字列などの要素をペアにして操作することで、コードの可読性を高め、よりPythonicな書き方を実現できます。
この記事で学んだこと:
zip
関数の基本的な使い方zip
関数がイテレータを返すこと要素数が異なる場合の
zip
関数の挙動とitertools.zip_longest
2つのリストから辞書を作成する方法
*
演算子を使ったアンジップ複数のイテラブルを同時にソートする方法
zip
関数を使いこなして、あなたのPythonコーディングをさらにレベルアップさせましょう!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座