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