C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

リストを連番でグループ分けする

リストに入った要素を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便利)