複数のリストを同時に処理 (zip / zip_longest) | Python-izm

複数のリストを同時に処理

Pythonでは複数リストタプルなどを同時に処理することができるzip関数、zip_longest関数(Python 2系ではizip_longest)があります。

zip

下記の例では2つのリストを同じループで処理し、それぞれの要素を取得しています。

item_list = ['desktop', 'laptop', 'tablet', 'smartphone']
stock_list = [12, 83, 55, 0]

for item_name, stock_count in zip(item_list, stock_list):
    print('{} / {}'.format(item_name, stock_count))
desktop / 12
laptop / 83
tablet / 55
smartphone / 0

zip_longest (izip_longest)

先の例ではそれぞれのリストは同じ要素数でした。要素数が異なる場合にzip関数で処理したらどうなるのでしょうか。

item_list = ['desktop', 'laptop', 'tablet', 'smartphone']
stock_list = [12, 83, 55]

for item_name, stock_count in zip(item_list, stock_list):
    print('{} / {}'.format(item_name, stock_count))
desktop / 12
laptop / 83
tablet / 55

実行結果のようにzip関数は要素数が少ない方に合わせて処理が終了します。zip_longest関数を用いると要素数が多い方に合わせて処理が行われます(Python 2系ではizip_longest関数を使用してください)。

Python 3系

from itertools import zip_longest

item_list = ['desktop', 'laptop', 'tablet', 'smartphone']
stock_list = [12, 83, 55]

for item_name, stock_count in zip_longest(item_list, stock_list):
    print('{} / {}'.format(item_name, stock_count))

Python 2系

# -*- coding: utf-8 -*-

from itertools import izip_longest

item_list = ['desktop', 'laptop', 'tablet', 'smartphone']
stock_list = [12, 83, 55]

for item_name, stock_count in izip_longest(item_list, stock_list):
    print '{} / {}'.format(item_name, stock_count)
desktop / 12
laptop / 83
tablet / 55
smartphone / None

またfillvalueを指定するとNone以外の値で補われます(Python 3系の例しか示しませんが、Python 2系のizip_longestでも同様です)。

Python 3系

from itertools import zip_longest

item_list = ['desktop', 'laptop', 'tablet', 'smartphone']
stock_list = [12, 83, 55]

for item_name, stock_count in zip_longest(item_list, stock_list, fillvalue='no stock'):
    print('{} / {}'.format(item_name, stock_count))
desktop / 12
laptop / 83
tablet / 55
smartphone / no stock