リストに入った要素を3個づつにグループ分けしたい時が有るんです。
検索してみると、こんな感じのサンプルが見つかります。
# Fusion360API Python script import traceback import pprint def run(context): try: lst = [1,2,3,4,5,6,7,8,9] group = [lst[i: i + 3] for i in range(0, len(lst), 3)] pprint.pprint(group, width=30) except: print('Failed:\n{}'.format(traceback.format_exc()))
結果はこちら
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
いや~出来てます。出来ているのですが、ちょっとダサい感じがするんです。
もっと良い方法無いのかと。
有りそうなのは標準モジュールのitertools。
調べてみるとzip_longestがありました。こんな感じです。
# Fusion360API Python script import traceback import itertools import pprint def run(context): try: lst = [1,2,3,4,5,6,7,8,9] group = list(itertools.zip_longest(*[iter(lst)]*3)) pprint.pprint(group, width=30) except: print('Failed:\n{}'.format(traceback.format_exc()))
結果はこんな感じ。
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
試しに、元リストを3で割り切れないよう
lst = [1,2,3,4,5,6,7,8,9,10]
にすると、それぞれ
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, None, None)]
うん、なるほど。
でも、zip_longestの引数の意味がわからない・・・。
青の "iter" は・・・あぁイテレータにするのか。知らなかった。
赤の "*" は・・・お前みたいなやつは検索しにくくて困る。
結局、アンパックって言うのか。知らなかった。
Python のアスタリスク (*) による List のアンパック - Python の基本 - Python 入門
ん~絶対に覚えられそうにない。
"itertoolsには何かある" とだけ覚えておこう。(itertools便利)