お困りの方へ
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株購入
