Pythonでは複数のリストやタプルなどを同時に処理することができるzip関数、zip_longest関数(Python 2系ではizip_longest)があります。
zip
下記の例では2つのリストを同じループで処理し、それぞれの要素を取得しています。
1 2 3 4 5 | 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関数で処理したらどうなるのでしょうか。
1 2 3 4 5 | 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系
1 2 3 4 5 6 7 | 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系
1 2 3 4 5 6 7 8 9 | # -*- 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系
1 2 3 4 5 6 7 | 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