Python if文 inで特定の要素が含まれているか判断MAYAアーティストのスクリプト入門

maya_python_if-in_topimage

if 文の条件式はさまざまありますが、in も条件式によく使われます。

in の使い方として例えば

「■●△〇□の中に△は含まれているかを判断し、
それをif文の条件とする」 

とか。

if文で使われる in の基本的は書き方は

if △ in  ■●△〇□:
    print("△が含まれています")

のように記述します。

これを踏まえて今回はPythonの if文で使われる in を紹介します。


if in を使ってlistに要素が含まれているか確認する

if in で使われる機会として最も多いのが list に特定の要素が含まれてるかの判断でしょう。

特定の数値がlistに含まれてるかの条件式

list_number = [1,50,80,20,4,68]

if 20 in list_number:
    print("20 found ")

出力

20 found

listの list_number に 20 が含まれていたらifの条件として  なので

“20 found “と出力します。

特定の文字列がlistに含まれてるかの条件式

list_str = ["maya","MEL","python","java","C++"]

if  "java" in list_str:
    print("'java' found")

出力

‘java’ found

これも数値のときと同様で
 
listの  list_str に ”java” が含まれていたらifの条件として  なので

“‘java’ found”と出力します。

if not inを使ってlistに要素が含まれていない事を確認する

if in を使って 含まれている 含まれていない を判断し

条件式として含まれていたら  という事を紹介しました。

この項目では  を紹介します。


必ずしも特定の要素が 含まれている 事を条件にしたい時ばかりではありません、
含まれていない 事を条件にしたい時もあります。

その様な時は if not in を使います。

list_number = [1,50,80,20,4,68]

if 42 not in list_number:
    print("42 not found")

出力

42 not found

listの list_number に 42 が含まれていないことがifの条件として  なので

“42 not found” と出力します。

if in で文字列の中に特定の単語が含まれているか確認する

if in で含まれいるかを判断できるのは list だけではありません。

文字列の中に特定の文字が入っているかを判断できます。

if "th" in "maya_python":
    print("'th' found ")

出力

‘th’ found

文字列 ”maya_python” に ”th” が含まれていたらifの条件として  なので

‘th’ found と出力します。

if in で辞書に特定のKeyが含まれているか確認する

Pythonには key と 要素 で組になった辞書と呼ばれる配列があります。

簡単に説明します。

gafa という名の辞書を用意して、
辞書gafaから鍵keyの ”apple” で組になっている要素を取り出します。

gafa  = {"google":"Android",
        "apple":"iPhone",
        "facebook":"oculus",
        "amazon":"Kindle"}

print(gafa["apple"])

出力

iPhone

辞書 gafa から keyの “apple” で iPhoneを取り出しました。

※Pythonの辞書について詳しい内容は別の記事に書きました。是非よんでみてください。
Python 辞書dictionaryの使い方-MAYA アーティストのスクリプト入門-

if in で辞書の中に特定の組が入っているのか確認

どんな時に辞書でif in を使うのか?

辞書に入っていないkeyを使って要素を取り出そうとするとエラーになります。

print(gafa["Microsoft"])
//出力
KeyError: 'Microsoft'

なので辞書の中に特定のkeyの組が入っているのか確認したい時などに使えます。

if "Microsoft" in gafa:
    print("Microsoft found")
else:
    print("Microsoft not found")

出力

Microsoft not found

辞書 gafa の中に “Microsoft”をkeyした組は無いので

 ”Microsoft not found” と出力されました。 

MAYAで応用 if in でオブジェクトに特定の頂点情報があるのか確認する

最後に応用編としてMAYAを使いましょう。

「選択したオブジェクトの頂点の中にアルファ値 0.5 が一つでも設定されていればそのオブジェクトを赤くする」

MAYAで実行するPythonのスクリプトコードを書きました。

import maya.cmds as cmds

ls_objs = cmds.ls(sl=True)

for item_ls_objs in ls_objs:
    item_ls_objs_Vt = cmds.polyListComponentConversion(item_ls_objs,tv=True)
    item_ls_objs_Vt_Expand = cmds.filterExpand(item_ls_objs_Vt,selectionMask=31)
    
    alpha_list = []
    for item_Vt_Expand  in item_ls_objs_Vt_Expand :
        alpha_list.append(cmds.polyColorPerVertex(item_Vt_Expand,q=True ,a=True)[0])
        
    if 0.5 in alpha_list:
        cmds.polyColorPerVertex(item_ls_objs,rgb=(1.0, 0.0, 0.0), cdo=True )

コードの説明

item_ls_objs_Vt = cmds.polyListComponentConversion(item_ls_objs,tv=True)

選択したオブジェクトを指定したコンポーネントに変換してlistで返します。

tv(toVertex)を指定してコンポーネントを頂点に変換しています。

item_ls_objs_Vt_Expand = cmds.filterExpand(item_ls_objs_Vt,selectionMask=31)

変換して返されたlistは 

[u’pCube5.vtx[*]’]

[*]と連番の数字は、まとめられて返さるので filterExpand で展開します。

filterExpand については別の記事で紹介していますので是非よんでみてください。

関連記事:
MAYAスクリプト[ls]でまとまって出力されたコンポーネントを展開する方法

    alpha_list = []
    for item_Vt_Expand  in item_ls_objs_Vt_Expand :
        alpha_list.append(cmds.polyColorPerVertex(item_Vt_Expand,q=True ,a=True)[0])

受け取った頂点から polyColorPerVertex でアルファ値を取得して alpha_list に追加しています。

    if 0.5 in alpha_list:
        cmds.polyColorPerVertex(item_ls_objs,rgb=(1.0, 0.0, 0.0), cdo=True )

頂点のアルファ値が追加されたlist alpha_list に 0.5 が含まれていたらそのオブジェクトを 赤くします。

頂点にアルファ値0.5を設定したオブジェクトを含めて複数選択してから実行します。

maya_python_if-in_selectcube

頂点にアルファ値0.5が設定された2つのオブジェクトが赤くなりました。

maya_python_if-in_red

最後に

if文 in の使い方が理解できたでしょうか?

if の条件式の一つとして in を使いますが、使えるのはlistだけではなく 文字列や辞書でも使えます。

使い方を覚えると条件式のバリエーションも増えてPythonスクリプトで出来ることも増えるので是非覚えてほしいと思います。


関連記事: