リストの操作
リストの操作
| Range[n] | リスト {1,2,3,…,n} |
| Table[expr,{i,n}] | i が1から n までの expr の値 |
| Array[f,n] | リスト {f[1],f[2],…,f[n]} |
| NestList[f,x,n] | 最大 n までネストする {x,f[x],f[f[x]],…} |
| Normal[SparseArray[{i1->v1,…},n]] | 要素 ik が vk である長さ n のリスト |
| Apply[List,f[e1,e2,…]] | リスト {e1,e2,…} |
Table[2 ^ i, {i, 5}]Array[2 ^ #&, 5]NestList[2#&, 1, 5]SparseArrayを使うと,特定の位置における値が指定できる:
Normal[SparseArray[{3 -> x, 4 -> y}, 5]]Normal[SparseArray[{i_ -> 2 ^ i}, 5]]| Table[expr,{i,list}] | i が list からの値を取る expr の値 |
| Map[f,list] | list の各要素に f を適用する |
| MapIndexed[f,list] | i 番目の要素に f[elem,{i}]を与える |
| Cases[list,form] | form と一致する list の要素を与える |
| Select[list,test] | test[elem]がTrueである要素を選び出す |
| Pick[list,sel,form] | list 中の要素で,それに対応する sel の要素が form にマッチするものを拾い出す |
| TakeWhile[list,test] | |
| list[[{i1,i2,…}]] または Part[list,{i1,i2,…}] | |
list の指定された部分のリストを与える | |
Select[{1, 3, 7, 4, 10, 2}, # < 5&]TakeWhile[{1, 3, 7, 4, 10, 2}, # < 5&]{a, b, c, d}[[{2, 1, 4}]]Pick[{a, b, c, d}, {1, 0, 1, 1}, 1]Nest[# ^ 2&, 2, 6]Reap[Nest[(If[# > 1000, Sow[#]];# ^ 2)&, 2, 6]]| Part[list,spec] または list[[spec]] | リストの部分 |
| Part[list,spec1,spec2,…] または list[[spec1,spec2,…]] | ネストしたリストの部分 |
| n | 最初から n 番目の部分 |
| -n | 最後から n 番目の部分 |
| {i1,i2,…} | 部分のリスト |
| m;;n | m から n までの部分 |
| All | 部分すべて |
{a, b, c, d}[[{1, 3}]]m = {{a, b, c}, {d, e}, {f, g, h}};m[[{1, 3}]]m[[{1, 3}, 1]]m[[{1, 3}, {1, 2}]]m[[1 ;; 2]]m[[1 ;; 2, -1]]m[[All, 2]]m[[All, -2 ;; -1]]m[[1, 2]] = xmm[[{1, 3}]] = {x, y};mm[[{1, 3}]] = p;mm = {{a, b, c}, {d, e}, {f, g, h}};m[[{1, 3}, {1, 2}]] = x;m;;を用いて指定範囲のすべての指標を示すことができる:
m[[1 ;; 3, 2]] = y;mネストしたリストを,全体が空間に置かれている各要素は座標の指標で与えられた位置にある,と考えると便利なことがある.このように考えると list[[spec1,spec2,…]]を直接幾何学的に解釈できるようになる.speck が単一の整数なら,それは k 番目の次元の単一スライスを抽出することを表し,これがリストの場合は平行スライスのリストを抽出することを表す.list[[spec1,spec2,…]]の最終結果は連続する次元をスライスして取得した要素の集合になる.
(m = {{a, b, c}, {d, e, f}, {g, h, i}})//TableFormm[[{1, 3}, {1, 2}]]//TableFormPartはネストしたリストの構造化されたスライスを取り出しやすいように設定されている.しかし,場合によっては個々の部分の任意の集合を取り出したいこともあるだろう.そのような場合はExtractを使うとよい.
| Part[list,{i1,i2,…}] | リスト{list[[i1]],list[[i2]],…} |
| Extract[list,{i1,i2,…}] | 要素 list[[i1,i2,…]] |
| Part[list,spec1,spec2,…] | 連続スライスによって指定された部分 |
| Extract[list,{{i1,i2,…},{j1,j2,…},…}] | 個々の部分のリスト{list[[i1,i2,…]],list[[j1,j2,…]],…} |
Extract[m, {{1, 3}, {1, 2}}]m = {{a[1], a[2], b[1]}, {b[2], c[1]}, {{b[3]}}};Position[m, b[_]]Extract[m, %]| Take[list,spec] | リスト中の指定の部分を取り出す |
| Drop[list,spec] | リスト中の指定の部分を除く |
| Take[list,spec1,spec2,…],Drop[list,spec1,spec2,…] | ネストしたリストの各レベルにおける指定部分を取り出したり除いたりする |
| n | 最初の n 個の要素 |
| -n | 最後の n 個の要素 |
| {n} | 要素 n のみ |
| {m,n} | m 番目から n 番目までの要素(両要素を含む) |
| {m,n,s} | m 番目から n 番目までの要素刻み幅 s で |
| All | 全部の部分 |
| None | 何も取り出さない |
Take[{a, b, c, d, e, f, g}, {2, -1, 2}]Drop[{a, b, c, d, e, f, g}, {2, -1, 2}](m = {{a, b, c}, {d, e, f}, {g, h, i}})//TableFormTake[m, 2, 2]//TableFormTake[m, All, 2]//TableFormDrop[m, None, 2]//TableForm| Prepend[list,elem] | list の頭に element を加える |
| Append[list,elem] | list の末尾に element を加える |
| Insert[list,elem,i] | 位置 i に element を挿入する |
| Insert[list,elem,{i,j,…}] | 位置{i,j,…}に挿入する |
| Delete[list,i] | 位置 i の要素を除去する |
| Delete[list,{i,j,…}] | 位置{i,j,…}の要素を除去する |
Insert[{{a, b, c}, {d, e}}, x, {2, 1}]Delete[%, {2, 1}]| ReplacePart[list,i->new] | list の位置 i の要素を new で置換する |
| ReplacePart[list,{i,j,…}->new] | list[[i,j,…]]を new で置換する |
| ReplacePart[list,{i1->new1,i2->new2,…}] | 位置 in の部分を newnで置換する |
| ReplacePart[list,{{i1,j1,…}->new1,…}] | 位置{in,jn,…}の部分を newnで置換する |
| ReplacePart[list,{{i1,j1,…},…}->new] | すべての部分 list[[ik,jk,…]]を new で置換する |
ReplacePart[{a, b, c, d}, 3 -> x]ReplacePart[{a, b, c, d}, {{1}, {4}} -> x]IdentityMatrix[3]ReplacePart[%, {2, 2} -> x]alist = {a, b, c, d}ReplacePart[alist, 3 -> x]alist| {list1,list2,…} | リストのリスト |
| Table[expr,{i,m},{j,n},…] | expr の値の m×n×…表 |
| Array[f,{m,n,…}] | 値 f[i,j,…]の m×n×…配列 |
| Normal[SparseArray[{{i1,j1,…}->v1,…},{m,n,…}]] | |
要素{is,js,…}が vs である m×n×…配列 | |
| Outer[f,list1,list2,…] | f で要素を結合した一般化された外積 |
| Tuples[list,{m,n,…}] | list の要素の可能なすべての m×n×…配列 |
Table[x ^ i + j, {i, 2}, {j, 3}]Array[x ^ #1 + #2&, {2, 3}]Normal[SparseArray[{{1, 3} -> 3 + x}, {2, 3}]]Outer[f, {a, b}, {c, d}]| Dimensions[list] | 完全配列の次元 |
| ArrayQ[list] | 指定されたレベルのすべてのサブリストが同じ長さかどうかテストする |
| ArrayDepth[list] | すべてのサブリストが同じ長さである深度 |
Wolfram言語は任意のネストしたリストを扱うことができる.リストが完全配列である必要はない.Tableを使って簡単に不調和配列を生成することができる.
Table[x ^ i + j, {i, 3}, {j, i}]| Flatten[list] | list の全レベルを平坦化する |
| Flatten[list,n] | 最上層から n 番目までのレベルを平坦化する |
| ArrayFlatten[list,rank] | 配列の配列から平坦化した配列を作成する |
Array[a, {2, 3}]Flattenは事実上要素をその指標によって辞書式順序に並べる:
Flatten[%]ArrayFlatten[{{{{1}}, {{2, 3}}}, {{{4}, {7}}, {{5, 6}, {8, 9}}}}]Array[a, {2, 2, 2}]Transpose[%, {3, 1, 2}]Transpose[%, {2, 3, 1}]| Map[f,list,{n}] | レベル n にある要素に f を写像する |
| Apply[f,list,{n}] | レベル n にある要素に f を適用する |
| MapIndexed[f,list,{n}] | レベル n の部分とその指標に f を写像する |
m = {{{a, b}, {c, d}}, {{e, f}, {g, h}, {i}}};Map[f, m, {2}]Apply[f, m, {2}]MapIndexed[f, m, {2}]| Partition[list,{n1,n2,…}] | n1×n1×…個のブロックに分割する |
| PadLeft[list,{n1,n2,…}] | n1×n1×…の配列を作るために左側に充填する |
| PadRight[list,{n1,n2,…}] | n1×n1×…の配列を作るために右側に充填する |
| RotateLeft[list,{n1,n2,…}] | レベル k で左側に位置 nk 分循環させる |
| RotateRight[list,{n1,n2,…}] | レベル k で右側に位置 nk 分循環させる |
m = {{{a, b, c}, {d, e}}, {{f, g}, {h}, {i}}};RotateLeft[m, {0, 1, -1}]PadRight[%, {2, 3, 3}]| Partition[list,n] | list を長さ n のサブリストに分割する |
| Partition[list,n,d] | オフセット d でサブリストに分割する |
| Split[list] | list を同一要素の組に分割する |
| Split[list,test] | test を満足する隣り合った要素に分割する |
Partition[{a, b, c, d, e, f}, 3]Partition[{a, b, c, d, e, f}, 3, 1]Partition[{a, b, c, d, e, f}, 2, 3]Split[{1, 4, 1, 1, 1, 2, 2, 3, 3}]Split[{1, 4, 1, 1, 1, 2, 2, 3, 3}, Unequal]Partitionは事実上リストの連続する要素をサブリストに分ける.デフォルトではもとのリストから「はみ出す」サブリストは含まない.
Partition[{a, b, c, d, e}, 2]Partition[{a, b, c, d, e}, 3, 1]Partitionを使ってもとのリストの端がはみ出すサブリストを含ませることもできる.デフォルトではもとのリストを循環的に使って追加要素を埋めていく.指定した要素で充填することも可能である.
Partition[{a, b, c, d, e}, 3, 1, {1, 1}]Partition[{a, b, c, d, e}, 3, 1, {1, 1}, x]Partition[{a, b, c, d, e}, 3, 1, {1, 1}, {x, y}]Partition[{a, b, c, d, e}, 3, 1, {1, 1}, {}]Partitionはテンプレートをもとのリストに沿ってスライドさせて要素を取り出すことでサブリストを抽出するものと考えることができる.このプロセスをどこから始めどこで終了するかをPartitionに指示することができる.
Partition[{a, b, c, d}, 3, 1, {-1, 1}, x]Partition[{a, b, c, d}, 3, 1, {-1, -1}, x]| Partition[list,n,d] または Partition[list,n,d,{1,-1}] | はみ出しのないサブリストだけを保存する |
| Partition[list,n,d,{1,1}] | 最後の部分のはみ出しを許す |
| Partition[list,n,d,{-1,-1}] | 最初の部分のはみ出しを許す |
| Partition[list,n,d,{-1,1}] | 最初と最後のはみ出しを許す |
| Partition[list,n,d,{kL,kR}] | 最初と最後のサブリストの並べ方を指定する |
| Partition[list,n,d,spec] | リスト list 中の要素を循環的に使って充填する |
| Partition[list,n,d,spec,x] | 要素 x を繰り返し使って充填する |
| Partition[list,n,d,spec,{x1,x2,…}] | |
xi を循環的に繰り返して充填する | |
| Partition[list,n,d,spec,{}] | 充填は行わない |
整列指定{kL,kR}はPartitionに,もとのリストの最初の要素が最初のサブリストの位置
にあり,もとのリストの最後の要素が最後のサブリストの
の位置にある一連のサブリストを与えるように指示する.
Partition[{a, b, c, d}, 3, 1, {1, 1}, x]Partition[{a, b, c, d}, 3, 1, {2, 1}, x]Partition[{a, b, c, d}, 3, 1, {4, 1}, x]Partition[{a, b, c, d}, 3, 1, {4, 1}, {x, y}]| PadLeft[list,n] | ゼロを左側に挿入して長さ n になるように充填する |
| PadLeft[list,n,x] | 要素 x を繰り返して充填する |
| PadLeft[list,n,{x1,x2,…}] | xi を循環的に繰り返して充填する |
| PadLeft[list,n,list] | list を循環的に繰り返して充填する |
| PadLeft[list,n,padding,m] | 右側に m 要素のマージンを残す |
| PadRight[list,n] | 右側にゼロを挿入して充填する |
PadLeft[{a, b, c}, 6]PadLeft[{a, b, c}, 6, {x, y}]PadLeft[{a, b, c}, 10, {x, y}, 3]PadLeft[{{a, b}, {e}, {f}}, {3, 3}, x]Partition[%, {2, 2}, {1, 1}]PadLeft[{{a, b}, {e}, {f}}, {4, 4}, {{x, y}, {z, w}}]PadLeft[{{}}, {4, 4}, {{x, y}, {z, w}}]通常Wolfram言語ではリストは要素の明示的なリストを与えて指定する.しかし,大きな配列を扱っているような場合には,特定の位置における要素の値が何かだけを指定し,その他の要素はすべてデフォルト値(通常ゼロ)にすることができると便利なことがある.WolframシステムではSparseArrayオブジェクトを使ってこうすることができる.
| {e1,e2,…}
,
{{e11,e12,…},…}
,
… | 通常のリスト |
| SparseArray[{pos1->val1,pos2->val2,…}] | |
疎な配列 | |
SparseArray[{2 -> a, 5 -> b}]Normal[%]SparseArray[{{1, 2} -> a, {3, 2} -> b, {3, 3} -> c}]Normal[%]| SparseArray[list] | list の疎な配列版 |
| SparseArray[{pos1->val1,pos2->val2,…}] | |
位置 posi で値が vali である疎な配列 | |
| SparseArray[{pos1,pos2,…}->{val1,val2,…}] | |
同じ疎な配列 | |
| SparseArray[Band[{i,j}]->val] | 値val である帯状疎配列 |
| SparseArray[data,{d1,d2,…}] | d1×d2×…の疎な配列 |
| SparseArray[data,dims,val] | デフォルト値 val の疎な配列 |
| Normal[array] | array の通常のリスト版 |
| ArrayRules[array] | array の位置と値の規則 |
SparseArray[{a, b, c, d}]Normal[%]SparseArray[{3 -> a, 5 -> b}, 7, x]Normal[%]ArrayRules[%%]SparseArray[{Band[{1, 1}] -> x, Band[{2, 1}] -> y}, {5, 5}]//MatrixFormSparseArrayの重要な特徴は,位置の指定にパターンが使える点である.
SparseArray[{i_, i_} -> 1, {4, 4}]Normal[%]Normal[SparseArray[{{1, 3} -> a, {i_, i_} -> 1}, {4, 4}]]Normal[SparseArray[{{_, 3} -> a, {i_, i_} -> 1}, {4, 4}]]SparseArray[rules]は可能なすべての位置指定を取り,次に rules を適用して各々の値を決定するものであると考えることができる.例によってリストの最初で与えられた規則が最初に適用される.
Normal[SparseArray[{{i_, i_} :> RandomReal[]}, {3, 3}]]Normal[SparseArray[i_ -> i ^ 2, 10]]Normal[SparseArray[{_ ? EvenQ -> p, i_ -> i ^ 2}, 10]]Normal[SparseArray[{1 | 3, 2 | 4} -> a, {4, 4}]]Normal[SparseArray[i_ /; 3 < i < 7 -> p, 10]]Normal[SparseArray[{{i_, j_} /; Abs[i - j] < 2 -> i + j}, {5, 5}]]Normal[SparseArray[{Band[{1, 1}] -> {2, 4, 6, 8, 10}, Band[{1, 2}] -> {3, 5, 7, 9}, Band[{2, 1}] -> {3, 5, 7, 9}}, {5, 5}]]いろいろな目的のために,WolframシステムはSparseArrayオブジェクトをこれに対応する他の通常のリストと同じように扱う.このため,例えば疎な配列オブジェクトの部分を問うと,Wolframシステムは対応する通常のリストにおける部分について問われたかの如き処理をする.
s = SparseArray[{2 -> a, 4 -> b, 5 -> c}, 10]Normal[s]s[[2]]s[[3]]多くの操作でSparseArrayオブジェクトは通常のリストと同じように扱われる.可能な場合は結果として疎な配列が返される.
3 s + xNormal[%]Dotは疎な配列オブジェクトに直接働く:
s.ss.Range[10]Wolframシステムは疎な配列をSparseArrayという頭部を持つ式として表す.疎な配列は評価されると常にSparseArray[Automatic,dims,val,…]という構造を持つ最適化された標準形に変換される.
t = SparseArray[{1 -> a, 5 -> b}, 10]InputForm[%]Lengthは対応する通常のリストの長さを与える:
Length[t]Mapもまた個々の値に働く:
Normal[Map[f, t]]