Pythonのzip関数の使い方

zipを使うことでコードがスッキリすることがあります。

DataFrameや辞書型は、データ属性が整理されていて便利です。
しかし、データがlistだけで構成されている場合は、データの関係性がわかりづらいです。
そこで、zipを使ってデータ構造を再構築できることがあります。

zip関数を理解して、可読性の高いコードを書けるようにしましょう。

zipはPythonの組み込み関数です。

zipとは

zipとは「複数のイテラブルを並行に反復処理し、各イテラブルの要素からなるタプルを生成します。」という関数です。

コードで見てみましょう。

la = [1, 2, 3]
lb = [4, 5, 6]

print(zip(la, lb))
print(type(zip(la, lb)))
# <zip object at 0x000001BF906E6BC0>
# <class 'zip'>

print(list(zip(la, lb)))
# [(1, 4), (2, 5), (3, 6)]
# 中身を見るには、listにする。

print(dict(zip(la, lb)))
# {1: 4, 2: 5, 3: 6}
# 辞書型を作れる。

zipに渡すリストの要素数が合わない場合は、少ない方に合わせてくれます。

バージョン3.10からは、要素数が合わない場合にエラーを発生するにはstrict=Trueを指定します。

la = [1, 2, 3]
lb = [4, 5, 6, 7]

print(list(zip(la, lb)))
# [(1, 4), (2, 5), (3, 6)]
# 要素数が少ない方に合わせる。

print(list(zip(la, lb, strict=True)))
# ValueError: zip() argument 2 is longer than argument 1
# Python 3.10からstrictに対応している。
# 3.10より前のバージョンでstrictキーワードを使うとTypeErrorになる。
# TypeError: zip() takes no keyword arguments

zipの使い方の例

リストの内包表記を使って、演算処理を簡単に書けます。

la = [1, 2, 3]
lb = [4, 5, 6]

print([x*y for x, y in zip(la, lb)])
# [4, 10, 18]
# 2つのリストの同じ位置の要素の掛け算を行う。

la = [1, 2, 3]
lb = [4, 0, 6]

print([x*y for x, y in zip(la, lb) if y is not 0])
# [4, 18]
# zipの機能ではなくリスト内包表記の機能だが、ゼロ割を防いでみる。

〇〇株式会社の株を△△円で✕✕株ほど買うという処理で、データがlistで扱われているときの例です。

company = ['aaa', 'bbb', 'ccc']
price = [500, 25, 333]
volume = [100, 1000, 200]

for c, p, v in zip(company, price, volume):
    print(f'{c}株式会社を{p}円で{v}株購入')

# aaa株式会社を500円で100株購入
# bbb株式会社を25円で1000株購入
# ccc株式会社を333円で200株購入