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() は繰り返し処理のために使うことができるのです。
この他,行列の計算などいろいろなリスト処理があります。応用編で具体的に使っていきますので,その都度マニュアルを参照して使い方を確かめてください。