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