Python Tips: 長い方のリストに合わせて zip したい

Python で複数のリストのループを回すときに、長い方のリストにあわせてループを回す方法についてご説明します。

Python では、組み込み関数 zip() を使うと、かんたんに複数のリストを同時に回すことができます。

names = ['Rao', 'Toki', 'Jagi', 'Ken']
numbers = [1, 5]

for name, number in zip(names, numbers):
    print([name, number])
# => ['Rao', 1]
# ['Toki', 5]

ただし、ループの回数は長さの短い方のリストに切り詰められます。この場合は names の長さが 4 、 numbers の長さが 2 なので、結果としてループの回数は 2 回となります。

これでよい場合は特に問題ないのですが、ループ回数を長い方にあわせてほしい場合はこれでは困ります。そんなときに便利なのが標準ライブラリ itertools の zip_longest() 関数です。名前がそのまま!ですね。

使い方は zip() とほぼ同じです。

from itertools import zip_longest

names = ['Rao', 'Toki', 'Jagi', 'Ken']
numbers = [1, 5]

for name, number in zip_longest(names, numbers):
    print([name, number])
# => ['Rao', 1]
# ['Toki', 5]
# ['Jagi', None]
# ['Ken', None]

短い方の足りない部分は None で代用されます。

以上です。

max(len(l1), len(l2)) で長い方のリストの長さは取得できるので、自分で実装してもさほど長い処理にはなりませんが、 zip_longest() を使うと Pythonic でわかりやすく書けるので、使えるところではなるべくこちらを使っていきたいところですね。