07 リスト

ここでは,リストの意味と,よく使うリスト処理を示します。詳しくは,マニュアルを参照してください。

リストの意味

リストは,"もの" を集めたものです。"もの" は,数でも,文字でも,リストでも,幾何要素でもよいですし,これらが混在していても構いません。

リストに入っているものを「要素」といいます。リストは,要素をコンマで区切って,全体を角かっこで囲みます。

例: 整数のリスト [1,3,5,7]

文字列のリスト ["きょうは","よく","はれました"]

リストのリスト [[2,3],["a","b"],[[2,4],[5,3]]]

幾何要素のリスト [A,B,C]

文字と整数の混在 ["東",1,"西",2,"南",3,"北"]

ベクトルと行列

数のリストはベクトル,または行列として扱うことができます。行列の場合は,行ベクトルを順に並べたリストです。

例:a=[2,1] はベクトル (2,3)

M=[[2,1],[3,4]] は2行2列の行列

リストの要素へのアクセス

リストの要素を読み出したり,書き換えたりするには,その要素にアクセスします。n番目の要素にアクセスするには,_n (アンダーバーn)または,関数 take(list,n)を用います。

例:num=[1,3,5,7,9] とします。

a=num_4; とすると,aに4番目の要素 7 が代入されます。

num_4=8; とすると4番目の要素は 8 に変わります。

要素の番号(インデックス)は,計算式にすることもできます。

上の例で,k=1;a=num_(2*k+1); とすると,aに5が代入されます。

ネストされたリストの場合は,インデックスを続けます。

例:M=[[1,3],[2,4]] のとき,a=M_2_1; とするとaには2番目のリストの第1要素 2 が代入されます。

インデックスを負の数にすると逆順に数えられます。

num=[1,3,5,7,9]; a=num_(-2); とすると,aには7が入ります。

インデックスをリストにするとまとめてアクセスして,その結果をリストにして返します。

num=[1,3,5,7,9]; a=num_[1,3]; とすると,aは[1,5] となります。

リストの作成

リストは,直接キーボードから打ち込む他に,計算で作ることができます。

整数列のリスト

m..n により,mからnまでの整数からなるリストができます。たとえば a=2..5; とすると aは [2,3,4,5] となります。逆順には作れません。逆順にしたい場合は正順で作っておいて,逆順にする関数で処理します。

計算結果(処理結果)をリストにする

apply(リスト,処理) はリストの各要素に処理を施した結果をリストにする関数です。この関数はとても便利です。リストの各要素は実行変数 # で表されます。apply(リスト,変数名,処理)として変数を明示することもできます。

例:

・奇数列のリストを作る: a=apply(1..5,#*2-1); で aは[1,3,5,7,9] となります。

・1から10までの整数のうち,3の倍数のときだけそれを2倍したリストを作る。

a=apply(1..10,if(mod(#,3)==0,2*#,#));

とすると,aは [1,2,6,4,5,12,7,8,18,10] になります。mod(#,3) は #を3で割った余りを返します。

リストの要素の個数を求める

リストの要素の個数は length(リスト)で求められます。

リストのすべての要素に対してある処理をする

forall(リスト,処理) は,リストのすべての要素に対して処理を行います。要素は実行変数 # で表されますが,明示的に使うには forall(リスト,変数,処理)とします。

例:いろいろな要素が混在したリストから実数だけの合計を求める。

data=[2,"a",A,4,[5,2],6];

s=0;

forall(data, if(isreal(#),s=s+#));

を実行すると,sは実数 2,4,6 の合計12になります。

例:forall(1..5,draw([#,#])); は,点列 (1,1),(2,2),(3,3),(4,4),(5,5) を描きます。

これは,repeat(5,draw([#,#])); としたのと同じです。

すなわち,forall() は繰り返し処理のために使うことができるのです。

この他,行列の計算などいろいろなリスト処理があります。応用編で具体的に使っていきますので,その都度マニュアルを参照して使い方を確かめてください。