【Python3】itertoolsのzip_longest()を使ってリスト要素をペアにしてみる

itertoolsとは何か

参考:https://docs.python.jp/3/library/itertools.html

itertoolsはイテレータを構築する部品を実装していて、
高速でメモリ効率に優れ、単独で組合せても使用することのできるツールを標準化したものです。

イテレータというのはざっと言うとリストの中にある各要素に繰り返しある一定の処理をするものです。

リストの要素を順番にペアにする処理

ペアでなくても、数字を指定すればその数字の要素数でひとかたまりにできます。

zip_longestというイテレータを使います。
参考:https://docs.python.jp/3/library/itertools.html#itertools.zip_longest

itertools.zip_longest(*iterables, fillvalue=None)
>>> list = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [i for i in itertools.zip_longest(*[iter(list)]*2)]  # 2個1セット
[(1, 2), (3, 4), (5, 6), (7, 8)]
>>> [i for i in itertools.zip_longest(*[iter(list)]*3)]  # 3個1セット
[(1, 2, 3), (4, 5, 6), (7, 8, None)] #尻切れたところはNoneが入ります
>>> list = [1, 2, 3, 4, 5, 6, 7, 8]
>>> for i in itertools.zip_longest(*[iter(list)]*2):
...     print(i)
... 
(1, 2)
(3, 4)
(5, 6)
(7, 8)
>>> for i in itertools.zip_longest(*[iter(list)]*3):
...     print(i)
... 
(1, 2, 3)
(4, 5, 6)
(7, 8, None)

ちなみに、余りを捨てても良いのであればzip()で書けます。

>>> list = [1, 2, 3, 4, 5, 6, 7, 8]

>>> for i in zip(*[iter(list)]*3):
...     print(i)
... 
(1, 2, 3)
(4, 5, 6)

>>> [i for i in zip(*[iter(list)]*3)]
[(1, 2, 3), (4, 5, 6)]