強弱と高低

Python3をメインに

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が回らない.

空リストを渡さなければ良いわけだが, 空リストを与える可能性は少なからず存在し, 例えば境界条件を与えるときとかの挙動を見るときなど. こういうときに見落としがちになる.

対策

  1. lenによる判定を追加する
  2. 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 で埋めてくれる.