【必須知識】pythonのzip関数の使い方まとめ(itertoolsモジュールとzip_longest関数)

zip関数はあらかじめpython内に作られた関数(組み込み関数)で、異なるリストの要素を取得することができます。pythonを今後使う方は必須な知識なので、これを期にしっかり覚えましょう。

zip関数とは

異なるイテラブルオブジェクト(リストやタプル)を同時に取り出してくれる処理を実行するのがzip関数です。

for 引数A, 引数B in zip(リストA, リストB, ・・・)

リストAとリストBのインデックスの値を、引数Aと引数Bで取得することができます。

例えば、「名前のリスト」と「年齢のリスト」を取得したい場合は、下記のコードになります。


python

# namesリスト、agesリストを取得して出力する names = ['kan', 'takumi', 'yuki'] ages = [28, 12, 35] for name, age in zip(names, ages): print(name, age) # 出力結果 kan 28 takumi 12 yuki 35

name(引数A)とage(引数B)をprintすることで、異なるリストの値を出力できます。

Python公式ページ – zip(*iterables)

zip関数の使い方【基礎編】

zip関数は、2つのリストだけでなく、3つ以上のリストを取得することができます。

3つのリストを取得したい場合は、次のようなコードになります。


python

# namesリスト、agesリスト、countriesリストを取得して出力する names = ['kan', 'takumi', 'yuki'] ages = [28, 12, 35] countries = ['Japna', 'America', 'India'] for name, age, country in zip(names, ages, countries): print(name, age, country) # 出力結果 kan 28 Japna takumi 12 America yuki 35 India

2つのコードを取得する場合と基本的なことは変わりません。

【注意】リストのインデックス数が異なる場合

リストのインデックス数が異なる場合、多いインデックス分が表示されません。

namesリストに、他のリストよりも多い「shota」と「koki」のインデックスを追加してみます。


Python

# namesリストだけ「shota」と「koki」を追加する names = ['kan', 'takumi', 'yuki', 'shota', 'koki'] ages = [28, 12, 35] countries = ['Japna', 'America', 'India'] for name, age, country in zip(names, ages, countries): print(name, age, country) # 出力結果(shotaとkokiが出力されていない) kan 28 Japna takumi 12 America yuki 35 India

「shota」と「koki」が出力されていないのがわかります。

インデックス数が異なる場合は注意しましょう。

zip関数の使い方【応用編】

もう少し深くzip関数についてみていきます。

itertoolsモジュールとzip_longest関数

原則、zip関数ではリストの要素数が異なる場合、多い要素が取得されないという性質を持っていますが、itertoolsモジュールとzip_longest関数を使うと多い要素も取得することができます。


python

# itertoolsモジュールの取得方法 from itertools import zip_longest # zip_longestを用いて、多い要素を出力する names = ['kan', 'takumi', 'yuki', 'shota', 'koki'] ages = [28, 12, 35] for name, age in zip_longest(names, ages): print(name, age) # 出力結果 kan 28 takumi 12 yuki 35 shota None koki None

上記のコードのように、itertools(モジュール)とzip_longest関数を用いると、「None」という値が出力されます。

また、「None」を、特定の値に変えることもできます。それが「fillvalue」です。


python

# itertoolsモジュールの取得方法 from itertools import zip_longest # zip_longestにfillvalueを指定する names = ['kan', 'takumi', 'yuki', 'shota', 'koki'] ages = [28, 12, 35] for name, age in zip_longest(names, ages, fillvalue=30): print(name, age) # 出力結果 kan 28 takumi 12 yuki 35 shota 30 koki 30

shotaとkokiに30という値が出力されているのがわかると思います。

dict型・list型・tuple(タプル)型に変換

zip関数で異なるリストの値を取得し、他の型に変換することができます。

dict型・list型・tuple型の変換するコードは下記の通りです。

dict型に変換


Python

# dict型に変換 names = ['kan', 'takumi', 'yuki'] ages = [28, 12, 35] dict(zip(names, ages)) # 出力結果 {'kan': 28, 'takumi': 12, 'yuki': 35}

list型に変換


Python

# list型に変換 names = ['kan', 'takumi', 'yuki'] ages = [28, 12, 35] list(zip(names, ages)) # 出力結果 [('kan', 28), ('takumi', 12), ('yuki', 35)]

tuple(タプル)型に変換


Python

# tuple型に変換 names = ['kan', 'takumi', 'yuki'] ages = [28, 12, 35] tuple(zip(names, ages)) # 出力結果 (('kan', 28), ('takumi', 12), ('yuki', 35))

zip関数まとめ

zip関数についてまとめると、以下の通りです。

  • zip関数は異なる2つ以上のリストの値を取得できる
  • リストの要素数が異なる場合は、多い要素は無視される
  • itertools(モジュール)とzip_longest関数を用いると、リストの要素数が異なる場合に役立つ
  • zip関数を用いて複数のリストを1つの型に変換することができる

pythonはデータの分析に用いられる言語なので、zip関数は必須な知識です。

使いこなせるまで、何度もコードを打って覚えましょう。

Related