zip関数やzip_longest関数は複数のイテラブルの同じ順番の要素をひとまとめにして一つのイテラブルにまとめる関数です。zipは複数のイテラブルのうち短いイテラブルの長さに合わせて、長いイテラブルの要素は無視されますが、zip_longest関数は長いイテラブルに合わせられ要素のないイテラブルについては任意の値で埋めてひとまとめにします。
zip関数
複数のイテラブルの同一順番の要素をまとめて、新しいイテレータを生成します。以下の図のように[a0, a1, a2, …]、[b0, b1, b2]、[c0, c1, c2, …]と3つのイテラブルが与えられたとき、まず最初の要素a0, b0, c0がまとめられ(a0, b0, c0)となります。次に2番目のa1, b1, c1がまとめられ(a1, b1, c1)となります(下図の結果参照)。
引数のえられたイテラブルの要素数が異なる場合、長い要素は無視されて処理されます。
zip関数の呼び出し例
実際にzip関数を呼び出してみます。
関東、東海、関西などエリア名の入ったイテラブルaと、平均年収が入ったbのイテラブルがあります。
a=['関東','東海','関西','中国・四国','北信越','北海道・東北','九州・沖縄']
b=[429,400,389,381,376,371,369]
z = [i for i in zip(a,b)]
print(z)
これをzip関数でまとめると以下のようになります。
実行結果
[('関東', 429), ('東海', 400), ('関西', 389), ('中国・四国', 381), ('北信越', 376), ('北海道・ 東北', 371), ('九州・沖縄', 369)]
このようにzipでまとめることで単独では意味のないイテラブルを意味のある固まりでまとめることができます。
zip_longest関数
引数のイテラブルの長さがすべて同じ場合には、zip関数とzip_longest関数は同じ動きをします。zipとzip_longestで異なるのは引数のイテラブルを長いほうに合わせてまとめます。足りない要素は指定した値で埋めた上で処理がおこなわれます。
例えば上図の場合、最初の引数の[a0, a1] は3番目以降の要素がありません。そのためzip_longestのfillvalueで指定した値が設定されます。もしfillvalueが指定されない場合にはNoneが設定されます。
zip_longest関数の呼び出し例
zip関数と異なりzip_longest関数は標準関数ではなくitertoolsパッケージに入っています。そのため最初にimportする必要があります。
from itertools import zip_longest
a=['関東','東海','関西','中国・四国','北信越','北海道・東北','九州・沖縄']
b=[429,400,389,381,376]
z = [i for i in zip_longest(a,b,fillvalue='-')]
print(z)
上のソースコードではfillvalueで'-'を指定しています。また2番目の引数であるb=[429,400,389,381,376]の要素が2つ足りないため、fillvalueの値で埋め込まれたあとzip処理されます。
実行結果
[('関東', 429), ('東海', 400), ('関西', 389), ('中国・四国', 381), ('北信越', 376), ('北海道・ 東北', '-'), ('九州・沖縄', '-')]
結果をみればわかるとおり最後の2つの要素についてはイテラブルのbの要素が足りないためfillvalueで指定した'-'がfillされています。
まとめ
zip関数の動作とzip_longest関数の違いについてのべました。
Comment on this article
コメントはまだありません。
Send comments