Tcl – リスト(3) -操作・加工・その他-

既存のリストや文字列を操作して、新しいリストや文字列を生成するコマンドとしてlinsert, lreplace, lsort, lreverse, split, joinがあります。

linsert, lreplace, lsort, lreverseは既存のリストは変更せずに新しいリストを生成して返します。

splitは文字列を分離してリストを生成します。joinはリストの要素を結合して文字列を生成します。

また、リストの各要素を別々の変数に一度に代入するコマンドとしてlassignコマンドが用意されています。

この記事は、それらのコマンドの使い方について紹介します。

要素を挿入 – linsertコマンド –

[書式]

linsert list index element ?element element ...? 

linsertコマンドは、indexで指定した要素の直前にelement(要素)を挿入した新しいリストを生成して返します。

indexが 0 以下の場合、新しい要素はlistの先頭に挿入されます。indexが end またはlistの要素数以上であれば、listの末尾に追加されます。「end-整数値」の指定も可能です。

[使用例]

% set oldList [list 10 20 60 70]
10 20 60 70

--(1)--
% set newList [linsert $oldList 2 30 40]
10 20 30 40 60 70

% set oldList
10 20 60 70
% set newList
10 20 30 40 60 70

[説明]

(1)

変数oldListを使用して2番目の要素の直前に 30 40 を挿入した新しいリストを変数newListに代入します。既存の変数oldListは変更されません。

既存の変数oldListを変更したい場合、以下のように新しいリストで上書きします。

set oldList [linsert $oldList 2 30 40]

 

指定した範囲の要素を置き換える – lreplaceコマンド –

[書式]

lreplace list first last ?element element ...? 

lreplaceコマンドは、first lastで指定した範囲の要素を、element(要素)に置き換えた新しいリストを生成して返します。

置き換える為のelement(要素)を指定しなければ、指定した範囲の要素が削除された新しいリストを生成して返します。

[使用例]

% set x [list a b {c d} e f]
a b {c d} e f

% set var [lreplace $x 2 3 C D]   ----(1)
a b C D f

% set var2 [lreplace $x 0 end-2]  ----(2)
e f

% set x    ----(3)
a b {c d} e f

[説明]

(1)
要素2番目から3番目を C D に置き換える。{c d} -> C, e -> D に置き換わる。

(2)
要素0番目から最後から2番目までを削除。

(3)
既存の変数x は変更されません。

要素を並び替える – lsortコマンド –

[書式]

lsort ?options? list 

lsortコマンドは、optionsで指定したソート順に従って並び替えた新しいリストを返します。並び替えのアルゴリズムは、マージソートが使用されます。

デフォルトのソートは、Unicode順(ASCII順)で昇順になっています。以下のオプションが指定できます。

**ソート方法**

options意味
-asciiUnicode文字列。(名前が -ascii なのは後方互換の為。)
-dictionary辞書。
-integerリスト要素を整数に変換し、整数比較を使用する。
-realリスト要素を浮動小数点値に変換し、浮動小数点比較を使用します。
-command command
-increasing昇順。(デフォルト)
-decreasing降順。
-indices値そのものではなく、並び替えた順序のindex番号をリストにして返す。
-index indexListこのオプションが指定された場合、リストの各要素は、それ自身が適切なサブリストでなければなりません。このオプションは、各サブリストからindexListで指定したindex番号の要素を参照して並び替えをします。
-nocase大文字、小文字を区別しません。
-dictionary、-integer、または-realオプションと組み合わせても効果がありません。
-uniqueこのオプションを指定すると、リストにある重複した要素の最後のセットだけが保持されます。 重複の判断は、ソートで使用される比較方法により決定されます。したがって、-index 0を使用すると、{1 a}と{1b}は重複しているとみなされ、2番目の要素{1b}のみが保持されます。
-stride strideLength

[使用例1]

% set var {a10 B2 b1 a1 a2 1 2 10 11}
a10 B2 b1 a1 a2 1 2 10 11

# Unicode順で昇順に並び替えたリストを返す。
% lsort $var              ----(1)
1 10 11 2 B2 a1 a10 a2 b1

# 並び替えた順序のindex番号をリストにして返す。
% lsort -indices $var     ----(2)
5 7 8 6 1 3 0 4 2

# 辞書順に並べたリストを返す。
% lsort -dictionary $var  ----(3)
1 2 10 11 a1 a2 a10 b1 B2

% set var2 {5 3 1 2 11 4}
5 3 1 2 11 4

# 整数で昇順(小さい順)に並び替えたリストを返す。
% lsort -integer $var2              ----(4)
1 2 3 4 5 11

# 整数で降順(大きい順)に並び替えたリストを返す。
% lsort -integer -decreasing $var2  ----(5)
11 5 4 3 2 1

# 既存の変数は変更されません。
% set var                  ----(6)
a10 B2 b1 a1 a2 1 2 10 11

# 既存の変数をソートしたリストに置き換える。
% set var [lsort $var]     ----(7)
1 10 11 2 B2 a1 a10 a2 b1

[使用例2]

% set x {{a 5} {c 3} {b 4} {e 1} {d 2}}
{a 5} {c 3} {b 4} {e 1} {d 2}

# 「a 5」が1つの要素としてソートする。
% lsort $x           ----(1)
{a 5} {b 4} {c 3} {d 2} {e 1}

# サブリストのindex番号の値でソートする。
% lsort -index 1 $x  ----(2)
{e 1} {d 2} {c 3} {b 4} {a 5}

[使用例3]

# 重複した要素の最後のセットだけが保持されます。
% lsort -unique {a b c 1 2 3 a b c}   ----(1)
1 2 3 a b c

# {1 a}と{1b}は重複しているとみなされます。
% lsort -unique -index 0 {{1 a} {1 b} {2 c} {2 d}}   ----(2)
{1 b} {2 d}

要素の並びを反転させる – lreverseコマンド –

[書式]

lreverse list 

lreverseコマンドは、要素の並びを反転させたリストを返します。

[使用例]

% lreverse {1 2 3 4 5}
5 4 3 2 1

% lreverse {1 2 {3 4} 5 6}
6 5 {3 4} 2 1

文字列を分離する – splitコマンド –

[書式]

split string ?splitChars? 

splitコマンドは、splitCharsで指定した各文字でstringを分割して作成されたリストを返します。

splitCharsが空文字の場合、stringの各文字が別々の要素になります。splitCharsのデフォルトは空白文字です。

stringsplitCharsの隣接文字が含まれる場合、またはstringの最初または最後の文字がsplitCharsにある場合、空のリスト要素が生成されます。

[使用例]

# 「.」部分で分離したリストを作成。
% split "blogs.yahoo.co.jp" .       ----(1)
blogs yahoo co jp

# 「-」部分で分離したリストを作成。
% split "1111-2222-3333" "-"        ----(2)
1111 2222 3333

# 「空文字」を指定すると、各文字が別々の要素として分離。
% split "abcde" {}                  ----(3)
a b c d e

# 「n」と「a」の部分で分割。
% split "ringo banana mikan" "na"   ----(4)
ri {go b} {} {} {} {} { mik} {} {}

このように区切り文字を慎重に選ばないと情報が失われる
可能性があります。

要素を結合する – joinコマンド –

[書式]

join list ?joinString? 

joinコマンドは、joinStringで指定した文字を区切り文字としてすべての要素を結合した文字列を返します。

joinStringのデフォルトは空白文字です。

[使用例]

# 各要素を「,」で結合する。
% join "1 2 3 4 5" ","          ----(1)
1,2,3,4,5

# 各要素を「, 」(カンマスペース)で結合する。
% join "1 2 3 4 5" ", "         ----(2)
1, 2, 3, 4, 5

# 各要素を結合する。
% join "1 2 3 4 5" ""           ----(3)
12345

# 各要素を「.」で結合する。
% join {blogs yahoo co jp} {.}  ----(4)
blogs.yahoo.co.jp

# 各要素を空白文字で結合する。
% join {a b {c d} {e f} g}      ----(5)
a b c d e f g

各要素を別々の変数へ代入する – lassignコマンド –

[書式]

lassign list varName ?varName ...? 

lassignコマンドは、リストの各要素を別々の変数に一度に代入します。

[使用例1]

# 各要素:a, b, c がそれぞれ別々の変数:x, y, z に
# 代入されます。

% lassign {a b c} x y z
% puts "$x $y $z"
a b c

[使用例2]

# リストの要素数より、変数の数が多い場合、残りの変数
# には、空の文字列がセットされ、エラーになりません。

% lassign {a b} x y z
% puts "$x $y $z"
a b

% puts $z

[使用例3]

# リストの要素数より変数の数が少ない場合、残った要素の
# リストが返されます。

% lassign {a b c d} x y
c d
% puts "$x $y"
a b

コメント

タイトルとURLをコピーしました