C#ATIA

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

リストからリストを除去する

"リスト" と言う文字から "リスト" を除去すると何も残りません。
そう言う事じゃないです。

pythonのリストから特定の1要素を除去する場合、幾つか方法があるようです。
Pythonでリスト(配列)の要素を削除するclear, pop, remove, del | note.nkmk.me

1要素では無くて、リストに入っている要素全てを除去する
清楚な書き方はどんなのがあるのかな?
と迷いました。

具体的に書けば、

ターゲットリストは0~9
除去したいリストは3,6,9

結果としては0, 1, 2, 4, 5, 7, 8が欲しい ってことです。

"3の倍数ならさっきのリンク先の一番最後の内包表記でif使えば簡単じゃん"
とお思いのあなた、そうです。
但し 偶々除去したいリストが偶々3の倍数だっただけです。

forでグリグリ廻せば出来ますが、それは清楚じゃないです。(下らないこだわり)
あくまでリストからリストを除去する清楚な書き方としたいんです。

removeの引数がリストでもイケるかな? と思ったのですが、
ダメなんですね。ん~。


結局思い付いたのがこちら。

import traceback
import adsk.fusion
import adsk.core

def run(context):
    ui: adsk.core.UserInterface = None
    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui = app.userInterface

        targetList: list = list(range(10))
        removeList: list = [3,6,9]

        app.log(f'targetList:{targetList}')
        app.log(f'removeList:{removeList}')

        # remove 
        # resList = targetList.remove(removeList) # NG

        resList = [v for v in targetList if not v in removeList]
        app.log(f'resList:{resList}')

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

もう、Fusion360とは無関係ですが出力の関係でimportしてます。

結果はこちら

 targetList:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 removeList:[3, 6, 9]
 resList:[0, 1, 2, 4, 5, 7, 8]

結局、内包表記のifです・・・。
1行にforとifとinが2回が入っているのは、他言語の方は異様に感じると思いますね。

数値では無く、あくまでオブジェクトでも大丈夫でした。(絶対忘れる)