Python zip関数を徹底解説!複数のイテラブルをまとめて扱う魔法の関数


 

Pythonプログラミングで複数のリストやタプルを同時に扱いたいと思ったことはありませんか?そんな時に大活躍するのが、Pythonの**zip関数**です。zip関数は、複数のイテラブル(リスト、タプル、文字列など)の要素を効率的に結合し、ペアとして処理することを可能にする強力な組み込み関数です。

この記事では、zip関数の基本的な使い方から、知っておくと便利な応用例までを徹底的に解説します。あなたのPythonコードをより簡潔でPythonicにするための知識を身につけましょう。


 

zip関数とは?なぜ便利なのか

 

zip関数は、引数として与えられた複数のイテラブルから、対応する位置の要素を1つずつ取り出し、それらをまとめたタプルを要素とするイテレータを返します。

 

なぜ便利なのか?

 

  • 複数データの同時処理: 関連する複数のデータを同時に処理する際に、コードを簡潔に書くことができます。

  • ループの簡素化: 複数のインデックスを管理する必要がなくなり、可読性が向上します。

  • 辞書作成の効率化: 2つのリストから辞書を効率的に作成できます。


 

zip関数の基本的な使い方

 

zip関数の最も基本的な使い方は、複数のリストを組み合わせてループ処理を行うことです。

Python
 
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歳です。

この例では、namesagesという2つのリストがzip関数によって結合され、ループ内でそれぞれの要素が同時にnameageに割り当てられています。


 

zip関数の戻り値と特徴

 

zip関数はイテレータを返します。そのため、一度イテレータを使い切ると、再度要素にアクセスするにはzip関数を呼び出し直す必要があります。リストやタプルに変換して永続化することも可能です。

Python
 
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関数に渡すイテラブルの要素数が異なる場合、最も短いイテラブルの長さに合わせて結合が停止します。

Python
 
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)を埋めて結合します。

Python
 
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関数は、キーとなるリストと値となるリストから辞書を効率的に作成するのに非常に便利です。

Python
 
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で結合されたものを元に戻す、いわゆる「アンジップ」を行うことができます。

Python
 
data = [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

names, ages = zip(*data)
print(names) # ('Alice', 'Bob', 'Charlie')
print(ages)  # (25, 30, 35)

これは、データがタプルのリストとして与えられた場合に、それぞれの要素を別々のリスト(またはタプル)として取り出したいときに非常に役立ちます。

 

3. 複数のイテラブルを同時にソートする

 

複数の関連するリストを、一方のリストのキーに基づいてソートしたい場合にもzip関数が使えます。

Python
 
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爆速講座