Pythonのzipとは?定義と基本構文、使い方を徹底解説
Pythonプログラミングでより効率的なコードを書くために、zip関数の理解は欠かせません。複数のリストやタプルを同時に処理したり、データを効率的に組み合わせたりする際にとても便利な機能です。
本記事では、応用範囲の広いzip関数の基本的な使い方から応用例まで、実践的なコード例を交えながら詳しく解説します。
初心者から上級者まで、Pythonプログラミングスキル向上に役立つ情報が満載です。
Contents
Pythonのzipとは?
Pythonのzip関数は、複数のイテラブル(リストやタプルなど)を要素ごとに組み合わせて、新しいイテレータを作成する機能です。
zip関数を使うと、複数のリストやタプルから、対応する要素を1つずつ取り出してペアにできます。
例えば、学生の名前リストと点数リストがあるとき、zip関数を使えば名前と点数を組み合わせて処理できます。
zipを応用する場面
zip関数を活用できる、データ処理の場面を見ていきましょう。
複数のリストから辞書を作成
キーとなるリストと値となるリストをzip関数で組み合わせ、簡単に辞書を作成できます。
# 日本の時代とそれに対応する開始年を辞書に格納する
era_names = [‘鎌倉’, ‘江戸’, ‘明治’]
era_start_years = [1185, 1603, 1868]
# zip関数を使って辞書を作成
japan_era_dict = dict(zip(era_names, era_start_years))
print(japan_era_dict)
# 出力:
# {‘鎌倉’: 1185, ‘江戸’: 1603, ‘明治’: 1868}
複数のリストを同時にループ処理する
zip関数を使えば1つのループで複数のリストのデータを扱えます。
# 商品リスト、価格リスト、数量リストを定義
products = [‘ノートパソコン’, ‘マウス’, ‘キーボード’]
prices = [90000, 3500, 5500]
quantities = [1, 5, 2]
# 複数のリストを同時に処理
for product, price, qty in zip(products, prices, quantities):
total = price * qty
print(f”{product}: {price}円 x {qty}個 = {total}円”)
# 出力:
# ノートパソコン: 90000円 x 1個 = 90000円
# マウス: 3500円 x 5個 = 17500円
# キーボード: 5500円 x 2個 = 11000円
行列の転置
転置は、データ分析や機械学習でよく使われる処理です。
百万要素を超える大規模な行列ではNumPyが利用されますが、小規模な場合はzipも有効です。
matrix = [ # 行列を定義
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# zip関数で転置
transposed = list(zip(*matrix))
for row in transposed:
print(row)
# 出力:
# (1, 4, 7)
# (2, 5, 8)
# (3, 6, 9)
zipの基本構文
zip関数の基本的な書き方は以下のようになります。
zip(iterable1, iterable2, …) # イテラブルを複数指定できます
例: 2つのリストを組み合わせる
numbers = [1, 2, 3]
letters = [‘a’, ‘b’, ‘c’]
result = zip(numbers, letters)
print(list(result))
# 出力:
# [(1, ‘a’), (2, ‘b’), (3, ‘c’)]
なお、zip関数は、イテレータオブジェクトを返します。
zipの基本的な使い方
zip関数の基本的な使用法を見ていきましょう。
リストを組み合わせる
zipの基本の使用方法です。
例えば、生徒の名前リストと点数リストを組み合わせて成績表を作成できます。
names = [‘田中’, ‘鈴木’, ‘佐藤’]
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f’{name}さん: {score}点’) # 名前と点数を1組ずつ出力
# 出力:
# 田中さん: 85点
# 鈴木さん: 92点
# 佐藤さん: 78点
タプルを組み合わせる
タプルは要素を変更できない特徴があります。データの安全性が重要な場合はタプルを使用すると便利です。
coordinates = (1, 2, 3)
labels = (‘x’, ‘y’, ‘z’)
for pos, label in zip(coordinates, labels):
print(f’{label}軸: {pos}‘) # 座標軸と位置を1組ずつ出力
# 出力:
# x軸: 1
# y軸: 2
# z軸: 3
文字列を組み合わせる
文字列も文字単位で組み合わせられます。複数の文字列を1文字ずつ対応させて処理するときに役立ちます。
str1 = ‘松竹梅’
str2 = ‘123’
for char1, char2 in zip(str1, str2):
print(f’{char1}{char2}‘) # 文字と数字を1組ずつ出力
# 出力:
# 松1
# 竹2
# 梅3
アンパック(unzip)の使い方について
アンパックは、zip関数で結合したデータを分解する操作です。
zip関数で作成したオブジェクトは、アスタリスク(*)演算子を使って元のデータに戻せます。
以下のコードで具体例を見てみましょう。
numbers = [1, 2, 3]
letters = [‘a’, ‘b’, ‘c’]
combined = zip(numbers, letters) # zip関数でデータをペア毎に結合
# [(1, ‘a’), (2, ‘b’), (3, ‘c’)]
num, let = zip(*combined) # アンパックでnumbers, letterに戻す
print(num) # (1, 2, 3)
print(let) # (‘a’, ‘b’, ‘c’)
アンパックした結果は、タプル形式で返されます。
アンパックは、複数のデータを一時的に結合して処理をおこない、処理後に元の形式へ戻す場合に便利です。
zipを使うときの注意点
Pythonのzipを使用する際には、いくつかの注意点があります。
異なる長さのイテラブルをzipで組み合わせると、最も短いイテラブルの長さに合わせて処理がおこなわれます。
例えば、[1, 2, 3]と[4, 5]をzipで組み合わせると、結果は(1, 4)と(2, 5)のみとなり、3は無視されます。
逆に長いほうへ合わせて処理したい場合は、itertools.zip_longestを使用できます。
from itertools import zip_longest
list1 = [1, 2, 3]
list2 = [4, 5]
# zip_longestは最も長いイテラブルの長さに合わせて処理します。
# 短いイテラブルの不足分はNoneで埋められます。
result = list(zip_longest(list1, list2))
print(result) # [(1, 4), (2, 5), (3, None)]
また、zip関数の戻り値は一度しか使えないイテレータです。必要な場合はlist()でリストに変換して保存するなどしてください。
メモリ効率の面では、zipは遅延評価されるため大量のデータを扱う場合でもメモリ消費を抑えられます。ただし、リストに変換する際はメモリを消費するため、大量データを扱う場合は注意が必要です。
まとめ
zip関数を使えば、複数のデータを簡単に組み合わせて処理できます。基本的な使い方から応用まで、実践的な例を通して理解を深めました。
本記事で学んだテクニックを、ぜひ実際のプログラミングに取り入れてみてください。