高度なリスト操作
高度なリスト処理¶
リストを他のリストに変換するいくつかの演算子があります。この節ではそのような演算子を扱います。これらは高度な計算をするのに強力なツールです。現実的な場面での使い方を知るために、CindyScript の描画の例を読むことを強く勧めます。
要素の組み合わせ¶
ペアを作る: pairs(<list>)¶
説明: この演算子は、リストに含まれるすべての要素から2つずつを組み合わせたペアの部分リストを要素とするリストを作ります。この演算子は、いくつかの点があるときそれらを結ぶすべての線分を作るときに有用です。
例:
| 式: | 結果: |
|---|---|
pairs([1, 2, 3, 4]) |
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] |
チェーンを作る: consecutive(<list>)¶
説明: この演算子は、引数 <list> の連続する2つずつの要素のペアからなるリストを作ります。
例:
| 式: | 結果: |
|---|---|
consecutive([1, 2, 3, 4, 5]) |
[[1, 2], [2, 3], [3, 4], [4, 5]] |
輪を作る: cycle(<list>)¶
説明: この演算子は、引数 <list> の連続する2つずつの要素のペアからなるリストを作ります。さらに、最後の要素と最初の要素もつなげます。
例:
| 式: | 結果: |
|---|---|
cycle([1, 2, 3, 4, 5]) |
[[1, 2], [2, 3], [3, 4], [4, 5], [5, 1]] |
3つの組合せを作る: triples(<list>)¶
説明: この演算子は、リストに含まれるすべての要素から3つずつを組み合わせた部分リストを要素とするリストを作ります。
例:
| 式: | 結果: |
|---|---|
triples([1, 2, 3, 4]) |
[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3,4 ]] |
2つのリストの直積を作る: directproduct(<list1>,<list2>)¶
説明: この演算子は2つのリストの直積を作ります。ここでいう直積とは、 <list1> の要素を第1成分に、 <list2> の要素を第2成分とした、すべてのペアからなるリストです。
例:
| 式: | 結果: |
|---|---|
directproduct([1,2,3],["A","B"]) |
[[1,"A"],[1,"B"],[2,"A"],[2,"B"],[3,"A"],[3,"B"]] |
入れ子リストの平坦化: flatten(<list>)¶
説明: この演算子は、リストが入れ子になっているときに、その入れ子を平坦化します。第2の入れ子を解除して平坦化したリストを返します。修飾子を使うと、再帰的な操作が可能です。また、平坦化のレベルを制御できます。
この演算子は、2つのリストの直積を作るのと似ています。直積は、<list1>の要素を第1成分に、 <list2> の要素を第2成分にしたリストを作ります。
修飾子: 修飾子 levels は、"all" ですべてを平坦化します。 整数を与えるとその回数だけ再帰的に平坦化します。 flatten(...,levels->1) は修飾子を付けない場合と同じです。
例: 次のリストを用意します。
list=[[1,2],[3,[4,5],[6,[7,8]]],6];
このリストに対して平坦化を行なった結果は次の通りです。
| 式: | 結果: |
|---|---|
flatten(list) |
[1,2,3,[4,5],[6,[7,8]],6] |
flatten(list,levels->0) |
[[1,2],[3,[4,5],[6,[7,8]]],6] |
flatten(list,levels->1) |
[1,2,3,[4,5],[6,[7,8]],6] |
flatten(list,levels->2) |
[1,2,3,4,5,6,[7,8],6] |
flatten(list,levels->3) |
[1,2,3,4,5,6,7,8,6] |
flatten(list,levels->"all") |
[1,2,3,4,5,6,7,8,6] |
順序¶
次の演算子はリストに含まれる要素の順序を変更します。
逆順にする: reverse(<list>)¶
説明: この演算子は、 <list> の要素を逆順にします。
例:
| 式: | 結果: |
|---|---|
reverse([1, 2, 3, 4]) |
[4, 3, 2, 1] |
並べ替え: sort(<list>)¶
説明: CindyScript においては、すべての要素はどんな2つの要素でも比較できるような自然な順序を有します。2つの要素は等しいか、どちらかが大きくなります。実数では通常の数の順序です。文字列では辞書順です。複素数はまず実部の順序で並べ、実部が同じなら虚部の順序になります。 リストは、最初の要素を比較します。さらに、慣例として次の順序があります。
ブール値 < 数 < 文字列 < リスト
例:
| 式: | 結果: |
|---|---|
sort([4.5, 1.3, 6.7, 0.2]) |
[0.2, 1.3, 4.5, 6.7] |
sort(["one","two","three","four","five"]) |
["five","four","one","three","two"] |
並べ替え: sort(<list>, <expr>)¶
説明: この演算子は、リストの各要素を <expr> の内容によって評価し、その結果に従って並べ替えます。
例:
| 式: | 結果: |
|---|---|
sort([-4.5, 1.3, -6.7, 0.2], abs(#)) |
[0.2, 1.3, -4.5, -6.7] |
sort(["one","two","three","four","five"],length(#)) |
["one","two","four","five","three"] |
並べ替え: sort(<list>, <var>, <expr>)¶
解説: sort(<list>, <expr>)と同じですが、 <var> を実行変数とします。
リストの要素を単一化した集合(set)を作る: set(<list>)¶
説明: この演算子は、リストのすべての要素を分類し、同一のものを取り除いて並べ替えます。すなわち、リストをオブジェクトの集合とみなして唯一の表現にします。演算子 concat, remove, common とともに用いて、集合の表現とすることができます。
例:
| 式: | 結果: |
|---|---|
set([3, 5, 2, 4, 3, 5, 7]) |
[2, 3, 4, 5, 7] |
set([3, 5, 2]++[4, 5, 2]) |
[2, 3, 4, 5] |
set([3, 5, 2]~~[4, 5, 2]) |
[2, 5] |