リスト †
リストは式或いはデータの集合を表わすものとして、SAD ではきわめて頻繁に用いられます。リストは全体を {} で囲み、要素間を , で区切って表わします。もちろんリストの要素は何であっても構いませんのでリストの中に何重にもリストを重ねることができます。また、リストとはその頭部がシンボル Listであるような式にすぎません。つまり、{1, 2, 3} と List[1, 2, 3]は同値です。従って、リストに対して作用できる関数は、多くの場合、頭部が List でない一般の式に対しても作用できます。
リストの演算 †
算術演算はリストの各要素に対して並列的に実行され、結果はまたリストです。この場合両被演算項がリストの場合は、両方の長さが一致していなければなりません。次の例の最後の行はこの条件を満たさなかったので、演算が行なわれていません。
{1, 2, 3} * 2
Out[1]:= {2,4,6}
{1, 2, 3} + {4, 5, 6}
Out[2]:= {5,7,9}
{1, 2, 3} + {{4, 5}, {6, 7}, {8, 9}}
Out[3]:= {{5,6},{8,9},{11,12}}
{1, 2, 3} + {4, 5, 6, 7}
Out[4]:= ({1,2,3}+{4,5,6,7})
また、多くの数学関数はリストに作用すると、その各要素に並列に作用し、結果をリストにして返します。
以上のような特性は多数のデータを取り扱うときにはきわめて重要で、できるだけリスト全体に対して演算や関数の作用を行うようプログラムすることにより、実行速度の向上させることができます。
このようなプログラミングの方向は、一言でいえば「できるだけ添え字を使わない」ということで表わされます。この方法は、ある程度までは、プログラムを簡略にし読み易くするという効果も伴います。しかし、ある点を越えると読み易さと実行効率が相反するようになり、そのどこでバランスをとるかは簡単には答えられない問題です。
リストはまた、ヴェクトル、行列、テンソルを表現するものともみなされます。
リスト生成 †
Table[] †
- Table[] は与えられた数の要素をもつリストを生成します。
- Table[式1, {数1}]は式1を数1回評価した値からなるリストを返す。
- Table[式1, {i,数1}]はシンボルiを1から数1まで1づつ増加させながら、式1を評価した値からなるリストを返す。
- Table[式1, {i, 数1, 数2}]はシンボルiを数1から数2まで1づつ増加させながら、式1を評価した値からなるリストを返す。
- Table[式1, {i, 数1, 数2, 数3}]はシンボルiを数1から数2まで数3づつ足しながら、式1を評価した値からなるリストを返す。
この場合シンボルiはこのテーブルの中だけで意味を持ちます。
もちろん、上で数1などと書いたところは、ある実数が与える式、という意味で、定数である必要はありません。但し、これらの値は反復が始まる時点で評価され、反復の途中で変更しても反復の回数には影響しません。
上で使われた式1, {i, 数1, 数2, 数3}の様な指定の仕方は反復指定子 iteratorと呼ばれ、他のDo, Sum, Productなどでも使われます。また、Table[式1, 反復指定子1, ..., 反復指定子n]はTable[Table[式1, 反復指定子n], 反復指定子1, ..., 反復指定子n-1]と同値でn次元のテンソルを表します。この場合後に書いた反復指定子ほど速く変化します。
Range[] †
- Range[数1]は1から 数1 までの 増分1のリストを返します。
- Range[数1, 数2]は数1 から 数2 までの 増分1のリストを返します。
- Range[数1, 数2, 数3]は数1から数2までの増分 数3 のリストを返します。
IdentityMatrix[] †
- IdentityMatrix[n]はn行n列の単位行列を返します。
DiagonalMatrix[] †
- DiagonalMatrix[リスト1]はリスト1の各要素を対角成分とする正方行列を返します。
リスト操作 †
以下の諸関数はリストの頭部が List でなくても成り立ちます。多くの場合、全体の頭部と部分リストの頭部の一致が必要です。
例えば
Dimensions[a[a[1, 2, 3], a[4, 5, 6]]]
は{2,3}ですが、
Dimensions[a[{1, 2, 3}, a[4, 5, 6]]]
は{2}です。
Length[] †
- Length[リスト1]はリスト1の要素の個数を返します。
- Length[原子]は 0 です。
Dimensions[] †
- Dimensions[リスト1]はリスト1をテンソルとみなして、その各次元の要素数をリストにしてかえします。
- Dimensions[ {{1, 2, 3}, {4, 5, 6}}] ⇒ {2, 3}。
従って、各要素の要素数が揃っていないようなリストは次元が浅くなります。
例えば、Dimensions[ {{1, 2, 3},{4, 5}}] ⇒ {2}となります。
Depth[] †
- Depth[リスト1]はリスト1 の最大階数+1、つまり最大何重の部分リスト(子リスト)から成り立っているか +1、を返します。Depth[{1, 2, 3}] ⇒ 2。Depth[{1, {{2, 3}, 4}, 5}] ⇒4となります。
Difference[] †
- Difference[expr_List]はi+1番目の要素からi番目の要素を差し引いた値を返す。
- Rest[expr_List]-Drop[expr_List,-1]と同値です。
Level[] †
- Level[リスト1, 階数1]
はリスト1の1階から階数1までの間に含まれるすべての要素をリストにして返します。
Level[{1, 2, {{3, 4}, 5}, 2] ⇒ {1, 2, {3, 4}, 5, {{3, 4}, 5}}。
階数1が負の場合はリスト1の1階から各々の枝の(最上階+ 階数1 +1)階までのすべての要素のリストを返します。「負の階数」の意味は以下の場合も同様です。
Level[{1, 2, {{3, 4}, 5}, -1] ⇒ {1, 2, 3, 4, {3, 4}, 5, {{3, 4}, 5 }}
- Level[リスト1, {階数1}]はリスト1の(階数1)階の要素のリストを返します。
- Level[リスト1, {階数1, 階数2}]はリスト1の(階数1)階から(階数2)階までの要素のリストを返します。
- 頭部の一致は無視されます。
- 階数0はリスト全体を指します。
- 上のLevelの第2引き数のようにリストあるいは式の階数の範囲を指定する方法は
階数指定子とよばれ、Map, Apply, Position, Count, Cases, DeleteCases,
MapIndexed, Scan に共通です。
RotateLeft[] †
- RotateLeft[list]は左回転を1回させたリストを構成する。
- RotateLeft[list,n]はリストlistの全要素をn回左方向に位置を回転させたリストを構成する。
RotateRight[] †
- RotateRight[list]は右回転を1回させたリストを構成する。
- RotateRight[list,n]はリストlistの全要素をn回右方向に位置を回転させたリストを構成する。
Take[] †
- Take[リスト1, n1]
はリスト1の1番目からn1番目の要素をリストにして返します。
n1 が負の場合は Take[リスト1, n1]はリスト1の(全長+n1+1)番目の要素から最後の要素をリストにして返します。-1 が最後の要素です。
- Take[リスト1, {n1, n2}]
はリスト1の n1から n2までの要素をリストにして返します。
- Take[リスト1, {n1}]
はリスト1のn1番目の要素だけをリストにして返します。
要素指定子を0にしても、頭部を意味することはありません。
いずれの場合も結果の頭部はリスト1の頭部と同じになります
上のような要素および要素の範囲の指定 (要素指定子a) は Drop などに共通です。
Drop[] †
- Drop[リスト1, 要素指定子a]
はリスト1 から要素指定子aで指定した要素を取り除いたリストを返します。この場合頭部はリスト1の頭部と同じになります。
要素指定子aはTake[]を参照してください。
First[] †
- First[リスト1]
はリスト1の最初の要素を返します。
Last[] †
- Last[リスト1]
はリスト1の最後の要素を返します。
Rest[] †
- Rest[リスト1]
はリスト1の最初の要素を取り除いた残りをリストにして返します。
- この場合頭部はリスト1の頭部と同じになります。
Reverse[] †
- Reverse[リスト1]
はリスト1の要素を全て逆に並び変えたリストを返します。
Append[] †
- Append[リスト1, 要素1]
はリスト1の最後尾に要素1を追加したリストを返します。
Prepend[] †
- Prepend[リスト1, 要素1]
はリスト1の先頭に要素1を追加したリストを返します。
Join[] †
- Join[リスト1, リスト2]
はリスト1とリスト2の両方の要素をこの順に結合したリストを返します。この場合両方の頭部は揃っていなければならず、結果の頭部も同じになります。
Flatten[] †
- Flatten[リスト1]
はリスト1の全ての階数の全ての要素を第$1$階に平坦に並べたリストをかえします。
Flatten[{1, 2, {{3, 4}, 5}}] ⇒ {1, 2, 3, 4, 5}。この場合頭部の一致が必要です。Flatten[{1, 2, {a[3, 4], 5}}] ⇒ {1, 2, a[3, 4], 5}。
- Flatten[リスト1, 階数1]
は1階から階数1までを平坦にします。
- Flatten[リスト1, 階数1, 頭部1]
は、1階から階数1までで且つ頭部が頭部1であるもののみを平坦にします。
Thread[] †
- Thread[{リスト1, リスト2, ...}]
はリスト1, リスト2, ... のそれぞれの第n要素からなるリスト達のリストを返します。
Thread[{{1, 2, 3}, {4, 5, 6}}] ⇒ {{1, 4}, {2, 5}, {3, 6}}。
- 頭部の一致が必要です。
- リスト1, リスト2, ... の中に最初のリストと長さが違うもの、頭部が違うもの、リストでないものが含まれる場合はその要素は結果のどのリストにも共通して含まれることになります。Thread[{{1, 2, 3}, 7, {4, 5, 6}}] ⇒ {{1, 7, 4}, {2, 7, 5}, {3, 7, 6}}。
長方形のリストに対しては Thread と Transpose は同一の結果を返します。
Partition[] †
- Partition[リスト1, n]
はリスト1の要素を頭からn個ずつ分配したリスト達のリストを返します。
リスト1の長さがnの倍数でない時には余りの要素は捨てられます。
Partition[{1, 2, 3, 4, 5}, 2] ⇒ {{1, 2}, {3, 4}}。
- Partition[リスト1, n, m]
はリスト1の要素を頭からm個おきに、重複を許してn個ずつ分配したリスト達のリストを返します。
Partition[{1, 2, 3, 4, 5, 6, 7}, 3, 2] ⇒ {{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}。
- Partition[リスト1, n]
は Partition[リスト1, n, n]と同値です。
Sort[] †
- Sort[リスト1]
はリスト1の各要素を標準的な順序(下記参照) にしたがって並べ替えたリストを返します。
Sort[{4, 2, 1, 3}] ⇒ {1, 2, 3, 4}。
- Sort[リスト1, テスト1]
は並べ替えを2変数関数 テスト1に従って行います。テスト1は True または False を返します。そのようなFFS関数の定義の仕方はFFS関数の定義を参照してください。
Sort[{4, 2, 1, 3}, Greater] ⇒ {4, 3, 2, 1}。
- 標準的な順序。型の違うものはこの上から順に並ぶ。(式の型: 型のなかでの順序)
- 実数: 小さいものから大きいものへ。
- 文字列: 最初の異なる文字の順に並べる。各文字はまず「無」が先頭で、次にアルファベットでないものがASCIIコードの順に並び、最後にアルファベットが aAbBcC...zZ のように並ぶ。
- シンボル 及び パターン原子: 名前を表わす文字列の順序
- リスト: 要素数の少ないものから。要素数が同じ場合頭部の順。頭部が同じ場合は第一要素の順、以下同様。
TableForm[] †
- TableForm[list]はlistの要素を長方形の配列にして出力する。
Union[] †
- Union[リスト1, リスト2, ...]
はリスト1, リスト2, ... のいずれかに含まれる要素達を重複せず集め、標準的な順序 に従って並べ変えたリストを返します。
Union[{3, -1, "c"}, {"c", 3, 3}, {1, "a"}] ⇒ {-1, 1, 3, "a", "c"}。
- Union[リスト1]
はリスト1の中の要素達を重複せず、標準的な順序に従って並べ変えたリストを返します。
Intersection[] †
- Intersection[リスト1, リスト2, ...]
はリスト1, リスト2, ... のいずれにも含まれる要素達を、標準的な順序に従って並べ変えたリストを返します。
Intersection[{3, 1, -2}, {1, "a"}, {1, 1}] ⇒ {1}。
Complement[] †
- Complement[リスト0, リスト1, リスト2, ...]
はリスト0の要素で、リスト1, リスト2, ... のいずれの要素でもないもの達を集め、標準的な順序に従って並べ変えたリストを返します。
Complement[{3, 2, 1, 3, 0}, {2, 1}, {4, 1}] ⇒ {0, 3}。
リストの要素に作用する関数 †
Part[] †
リストの個々の要素の取り出しは、リストもひとつの式ですから、式の要素の取り出しを行う関数 Part (演算子 [[]])で出来ます*1 *2。
- foo[bar]のPart[]演算子の引数[bar]に対して [演算子の直前に暗黙の Nullが仮定されるのでfoo[[Null[bar]]]と構文解析され、Part[foo, Null[bar]]と等価になります。評価時にはNull[bar]がbarに展開されるので、最終的な評価はPart[foo, bar]になりますから、foo[bar]は標準の変換規則のみで foobarと等価な意味を持つ表現です。(foo[bar]が、fooを Listに束縛されているときにPart[foo, bar]と解釈される構文糖とは全く関係ありません)
- リストfの n1 番目の要素はf[[n1] ]で取り出します。
- 取り出したリストまたは式の更にn2 番目の要素はf[[n1, n2] ]
で取り出します。この場合 Part[f, n1, n2, ... ] とf[[n1, n2, ... ] ]
は同値です。また、f[[n1] ][[n2] ]とf[[n1, n2] ]
は同値です。
- インデクス n1, n2, ... は0が頭部、1が最初の要素、となっており、負の場合は最後の要素から逆に数えた順になります。
- Part[]では頭部の一致は必要ありません。
- f[[{n11, n12, ..}, n2, ] ]は第 1 インデクスが n11, n12, ...で、第 2 インデクスがn2 以下で指定される要素になるような要素達のリストを返します
{{1, 2}, {3, 4}, {5, 6}, {7, 8}}[[{2, 4}, 2]] => {4, 8}
- あるインデクスが省略または Null にされると、そのインデクスが 1 から要素数までの全ての値に対して、ほかのインデクスが指定の値になるようなリストを返します。
{{1, 2}, {3, 4}, {5, 6}, {7, 8}}[[, 2]] => {2, 4, 6, 8}。
Insert[] †
- Insert[リスト1, 新要素1, n1]
はリスト1 の n1 番目の位置に 新要素1 を挿入したリストを返します。
- Insert[リスト1, 新要素1, {n1, n2, ... }]
はリスト1の {n1, n2, ...} の位置 リスト1[[ n1, n2, ...] ]
に 新要素1 を挿入したリストを返します。
- Insert[リスト1, 新要素1, {{n1, ...}, {n2, ... }}]
はリスト1 の 幾つかの位置達に 新要素1 を挿入したリストを返します。
上のような要素の位置の指定法(要素指定子b)は Take[] の場合とは異なっています。これは、Delete[], Extract[], FlattenAt[], MapAt[]等で用いられます。
Delete[] †
- Delete[リスト1, 要素指定子b1]
はリスト1の要素指定子b1 (Insert[]を参照) で指定される要素を取り除いたリストを返します。
ReplacePart[] †
- ReplacePart[リスト1, 新要素1, 要素指定子b1]
はリスト1 の要素指定子b1 (Insert[] を参照) で指定される位置達に 新要素1 を代入したリストを返します。すなわち:
- ReplacePart[リスト1, 新要素1, n1]
は リスト1 の n1 の位置に 新要素1 を代入したリストを返します。
- ReplacePart[リスト1, 新要素1, {n1, n2, ... }]
は リスト1 の {n1, n2, ...}の位置 リスト1[[n1, n2, ...] ]
に 新要素1 を代入したリストを返します。
- ReplacePart[リスト1, 新要素1, {{n1, ...}, {n2, ... }}] は
リスト1の 幾つかの位置達に 新要素1 を代入したリストを返します。
例えば
ReplacePart[a, new, ...]
としたときに、ReplacePart[] という語感からは、元のリスト a の一部も変更されるかのような感じを受けますが、そうではありません。ReplacePart[] は一部を置き換えた結果のリストを返すだけなので、もし元のリストも変更したければその結果をシンボル a に再度 Set[] するか、以下に述べる様に Set[] の左辺に Part[] を用いる必要があります。
Extract[] †
- Extract[リスト1, 要素指定子b1]
はリスト1 の要素指定子b1 (Insert[] を参照) で指定される要素達を返します。
- Extract[リスト1, 要素指定子b1, 関数1]
は リスト1 (式でもよい) の要素指定子b1 (Insert[]を参照) で指定される要素達に{それを評価せずに 関数1 を適用した結果達}を返します。
- Extract[Hold[{Sin[1], Cos[1]}], {1, 2}, Hold] => Hold[Cos[1]]
(Hold[] を参照)。
FlattenAt[] †
- FlattenAt[リスト1, 要素指定子b1]
はリスト1 の 要素指定子b1 (Insert[]を参照) で指定される要素のすぐ下に属する要素達を表に取り出して同列にならべたリストを返します。
- FlattenAt[{1, {2, {3, 4}}, 5}, {2}] => {1, 2, {3, 4}, 5}
上の例のように、表に出るのはその要素の直下のもの、2 と {3, 4} だけで、更に深いもの、3 や 4は表には出ません。頭部の一致は必要ありません。
- FlattenAt[{1, a[2, {3, 4}], b[5]}, {{2}, {3}}] => {1, 2, {3, 4}, 5}
リストの要素の値の設定 †
- いまあるシンボル a にリスト(あるいは式) が割り当てられているとき、
演算子 Part[] を Set、SetDelayed の式の左辺に用いて
a[[n1, n2, ...]] = 式1
のようにすると、シンボル a に割り当てられたリスト(式) の n1, n2, ... 番目の要素が右辺の値に置き換わります。これはあたかも他の言語における配列への代入に似ています。
この方法と上述の ReplacePart[]とを混同しないように注意してください。