pythonのzipの扱いは注意
事象
例えば, 下のようなプログラムがあったとしよう. ここで期待されるのは, i, jが標準出力されることである.
for i, j in zip(list_A, list_B): print(i, j)
しかし, なぜかi, jの中身がprintされない...なぜだ...となった.
原因
zipは短い方のリストに合わせてしまうため, 片方が空リスト[]だと, forが初手でループを終えてしまい, for以下が実行されない.
for i, j in zip(list_A, []): print(i, j)
こうなってしまっているとき, zipはlist_Aがどれだけ長かろうが空リストの数しかイテレーションをしない. つまり, forが回らない.
空リストを渡さなければ良いわけだが, 空リストを与える可能性は少なからず存在し, 例えば境界条件を与えるときとかの挙動を見るときなど. こういうときに見落としがちになる.
対策
- lenによる判定を追加する
from itertools import zip_longest
を使う
len によるリストの長さ判定
これは言わずもがなである. 空じゃなければ, for文を回せば良い.
itertoolsのzip_longest を使う
ただのzip は, 短い方に合わせてしまう
A = [1, 2, 3, 4, 5] B = [6, 7, 8] zip(A, B) --> zip([1, 2, 3], [6, 7, 8]) 短いリストBの長さ3に合わせてしまう ※書き方は正しくないけれど,こういうこと
しかし, zip_longestは, 長い方のリストに合わせ, 足りない分はNone
で埋めてくれる.