MODOではじめるPython_04 配列

mihi
こんにちは、mihiです。
今回は「配列」について詳しく解説していきます。
MODOのスクリプトを書く上で配列は多用しますので、
ぜひ理解を深めてください。

配列

「int型」や「float型」といった型の変数には、値を1つしか持つことができません。
ですが、スクリプトを書いていると複数の値をまとめて1つの変数に保持しておきたい場合が良くあります。
MODOのスクリプトで例えるなら、「選択されている頂点のインデックスをすべて保持しておきたい」という場合などが考えられます。
そこで、「配列」を使用することで1つの変数に複数の値を保持しておくことが可能となります。

list型(リスト)

配列には「list型(リスト)」と「tuple型(タプル)」の2種類存在しますが、
まずは、「list型」から解説していきます。

list型の配列の宣言

まずは変数を宣言し、配列を代入します。
以下のように記述すると配列を作成できます。

a = []

「list型」の配列を代入する場合は、まず変数を宣言[]として代入すると、空の配列が変数へ代入されます。
この場合「a」という変数を宣言し、空の「list型」の配列を代入しています。

配列の値も同時に代入する

変数宣言時に配列の値を同時に代入することも可能です。

a = [1, 2, 3, 4, 5]

上記のようにすると、変数「a」には「list型」の配列で
「1・2・3・4・5」の5個の値(int型の値が5個)が代入されていることとなります。
配列の中の値1つ1つのことを「要素」と呼びますが、
要素は「,カンマで区切って列挙します。

配列の要素の「型」は全て同じ必要はなく、複数の型の値を保持することも可能です。

a = [1, 'MODO', 15.2]

などとして、「int型」・「string型」・「float型」などをごちゃまぜすることも可能です。
あまりごちゃまぜだと訳が分からなくなるので、こういった要素の代入はあまりしませんが、
きちんとルールを決めて使えば、便利です。

例えばMODOのスクリプトの場合、
[頂点のインデックス(int型), その頂点のメッシュレイヤーの名前(string型)]として、
セットの配列を作成するという場合は、あります。

vertex = [1, 'Mesh']

上記ででは「vertex」という変数を宣言して、
「頂点インデックス1番、メッシュレイヤーの名前は”Mesh”」
とセットにした「list型」の配列を作成しています。

要素の参照

配列にデータが複数入っているのは良いとして、
そのデータにアクセスしたい場合はどうすればよいでしょうか。

配列は要素に対して「インデックス」が与えられています。
インデックスとは、要は順番のことです。

a = [1, 2, 3, 4, 5]

この場合、
・1番目に「1」
・3番目に「3」
・5番目に「5」
という値が入っています。

ですが・・・Pythonは「1番目」は「0番」というルールがあります。

ですので、正しくは
・0番目に「1」
・2番目に「3」
・4番目に「5」
となります。

そして、この何番目といういのが「インデックス」です。
・インデックス「0」は「1」
・インデックス「3」は「4」
となります。

では、インデックス「1」の値を参照したい場合の書き方を紹介します。

a = [1, 2, 3, 4, 5]
print(a[1])

変数名[インデックス] (上記の場合、a[1] の部分です。)
とすることで、その配列の指定インデックスの値にアクセスすることができます。
スクリプトを実行すると、変数「a」の配列のインデックス「1番」の値が表示されるはずです。

配列の値を変更する

一度作成した配列の特定の要素の値を変更したい場合は、
変数名[インデックス] = 値
とすることで、簡単に値を変更することができます。

a = [1, 2, 3, 4, 5]
print(a[2])

a[2] = 10
print(a[2])

としてスクリプトを実行してみましょう。
変数「a」の宣言時には、インデックス「2番」は「3」ですが、
あとから「10」に書き換えている例です。

初めは「3」だった値が「10」に変わっていることがわかります。
ちなみに、

print(a)

とすることで、配列の中身をすべて表示することも可能です。

配列に要素を追加する

一度作成した配列に、「後から要素を追加したい」というのはよくあります。
そこで、配列のメソッドを使用します。
なんだか「メソッド」とかという用語が出てくると難しく感じますよね。
きっちりと解説するとなると、

Pythonはオブジェクト指向のプログラミング言語でクラスが・・・・・・・

となってしまいますので、
本当はそういったことも理解している方が良いのですが、
とにかく「MODOでスクリプトが書けるように」最速で目指したいので、
そういった小難しい話はすっ飛ばすこととします。

そこで、配列の「メソッド」についてですが、
「配列を操作するための便利機能詰め合わせパック」
と理解しておいてください。
その詰め合わせパックの一つに、
配列に要素を追加する」という機能があります。

書き方は、

変数名.append(値)

と書きます。
.append()
が「メソッド」となり、引数が「追加する値」です。

おや?
引数という言葉が出てきました。
そうなんです。
メソッドの正体は関数です。

ですので、
「配列を操作するための配列専用の便利関数詰め合わせパック」
とも言えます。

・変数名.メソッド(引数) (メソッドによっては引数が不要なものもあります)
・変数名の次に「.」を付け、メソッド名とすることに気を付けてください。
・append()は、配列(正しくはlist型)以外では使えないメソッドです。

では、配列に要素を追加してみましょう。
以下のように記述して、スクリプトを実行します。

a = [1, 2, 3, 4, 5]
a.append(6)

print(a)

配列の最後の要素に「6」が追加されれば成功です!

配列を操作するメソッドはほかにも、

  • extend() 他の配列の要素を追加する
  • insert() 指定したインデックスに要素を挿入する
  • pop() 指定したインデックスの要素の値を取得と同時に、その要素を削除
  • del() 指定したインデックス、もしくは範囲の要素を削除
  • ・・・などなど

数種類の便利機能が装備されています。
それぞれについては、MODOのスクリプトを書きながら紹介できればと思います。

tuple型

tuple型(タプル)も基本的にlist型(リスト)と配列としては変わりません。
ですが、tuple型は要素・値の操作が一切できません。

ですので、要素の追加・削除・値の変更などの操作が一切できない配列です。
このような「tuple型」の配列は、関数の戻り値として帰ってきた場合が多いと思います。

MODOのスクリプトでも、選択している頂点を返す関数がありますが、戻り値は「tuple型」の配列として帰ってきます。

tuple型の配列を宣言

a = ()

変数名 = ()

とすることで、tuple型の変数を宣言・代入できます。
しかし、値の変更などが許されないtuple型なので、
このように宣言すると、空の何もできない無駄な配列が作成されたことになります。

a = (1, 2, 3, 4, 5)

とすれば、値の設定された「tuple型」の配列を準備できます。

 

mihi
今回はここまでです。
配列についての入門でした。

「list型」と「tuple型」
同じ配列なのになぜ2種類あるのか?

莫大な量のデータを処理しようとしたときに、
要素の追加や変更・削除など、いろいろ操作できる「list型」より、
なにも操作ができない「tuple型」のほうが、
実は処理速度が速いというメリットがあります。

ですが、MODOのスクリプトを書く場合においては、
便利な「list型」を使えばよいと思います。

>Profile

Profile

■mihi■

愛猫家

フリーランスとして建築CGを制作しています。

「MODO」と「3dsMax」を使用した
建築CGのテクニックや
日々の雑記を発信していきます。

よろしくお願いいたします。

CTR IMG