Tcl – リスト(2) -要素の参照・検索-

リストの情報や要素を参照するコマンドとしてllength, lindex, lrange, lsearchがあります。この記事は、それぞれの使い方を紹介します。

リストの要素数を調べる – llengthコマンド –

[書式]

llength list

llengthコマンドは、要素数を返します。

[使用例]

% llength {a b c d e}
5
% llength {10 20 {30 40} {50 60}}
4

指定した位置の要素を参照する – lindexコマンド –

[書式]

lindex list ?index ...?

lindexコマンドは、indexで指定された要素を返します。indexを省略した場合はlistをそのまま返します。

[使用例]

% set x {10 20 {30 40} {50 60} 70}
10 20 {30 40} {50 60} 70

% lindex $x 2      ----(1)
30 40
% lindex $x end    ----(2)
70
% lindex $x end-2  ----(3)
30 40
% lindex $x 3 1    ----(4)
60

[説明]

(1)

lindexコマンドはリストに含まれる特定の要素を返します。要素の位置(index)は先頭の要素が0番になり0から順番に数えます。

(2)

indexにendがあると最後の要素を参照します。

(3)

end-整数値で末尾から指定した整数値を引いた位置の要素を参照します。

(4)

リストがネストされている場合、引数を複数指定することができます。引数は{}で囲んでも構いません。
  lindex $x 3 1 または lindex $x {3 1} は
  lindex [lindex $x 3] 1 と同じです。

指定した範囲の要素を参照する – lrangコマンド –

[書式]

lrange list first last

lrangコマンドは、first lastで指定された範囲の要素をリストで返します。

[使用例]

% set x {10 20 {30 40} {50 60} 70}
10 20 {30 40} {50 60} 70

% lrang $x 2 end   ----(1)
{30 40} {50 60} 70

% lrang $x 2 2     ----(2)
{30 40}
%lindex $x 2
30 40
% list [lindex $x 2]
{30 40}

[説明]

(1)

指定範囲の要素をリストで返します。lindexコマンドと同様にendキーワードが使えます。

(2)

lrangeコマンドは、指定した位置の要素をリストとして返します。lindexコマンドは、指定した位置の要素をそのまま返します。

しかし「list [lindex list index]」とは、まったく同じ結果を生成します。

指定した要素が含まれるか調べる – lsearchコマンド –

lsearchコマンドは、リストに特定の要素を含むかどうか調べます。

[書式]

lsearch ?options? list pattern

指定したlistから patternに一致する要素を検索し、要素が見つかった場合は、そのindex番号を返します。見つからなかった場合は、-1 を返します。optionsを省略すると、デフォルトではglob形式のパターンマッチングを行います。

[参考]

グロブ - Wikipedia
正規表現 - Wikipedia

※グロブ形式と正規表現の説明は別の記事で紹介しようと思います。

[optionsに指定できるもの]

**マッチング形式**

options意味
-exactpatternと完全に一致するものを検索します。
-globpatternにglobスタイルを使います。
-regexppatternに正規表現を使います。
-sortedリストの要素がソートされている場合に、このオプションを指定すると、より効率的な検索アルゴリズムを使います。

※ -exact, -glob, -regexp, 及び -sortedのうち1つ以上が指定された場合最後に指定されたものが優先されます。

**検索処理**

options 意味
-allpattern に一致したすべてのindex番号をリストで返します。(-inlineも指定された場合、マッチしたすべての要素)
-inlineindex番号の代わりに検索で一致した要素を返します。一致しなかった場合は空文字列を返します
-notpattern に一致しなかったindex番号を返します。
-start indexindexで指定した位置から検索します。indexにendを指定すると最後の要素を参照する。end-整数で末尾から指定した整数値を引いた位置から検索します。

**要素スタイルの指定**

options意味
-asciiリストの要素がUnicode文字列とみなして検索します。(名前が -ascii なのは後方互換の為。)
-dictionaryリストの要素が辞書順とみなして比較します。このオプションは -exact または -sortedといっしょに指定した場合のみ有効です。
-integerリストの要素が整数とみなして検索します。このオプションは -exact または -sortedといっしょに指定した合のみ有効です。
-realリストの要素が浮動小数点値とみなして検索します。このオプションは -exact または -sortedといっしょに指定した場合のみ有効です。
-nocase大文字、小文字を区別しません。-dictionary、-integer、または-realオプションとともに使用すると効果がありません。

※-ascii, -dictionary, -integer, 及び -realのうち1つ以上が指定された場合、最後に指定されたものが優先されます。

options意味
-decreasingリストの要素が降順にソートされているとみなして検索します。このオプションは -sortedといっしょに指定した場合のみ有効です。
-increasingリストの要素が昇順にソートされているとみなして検索します。このオプションは -sortedといっしょに指定した場合のみ有効です。

※-increasing 及び -decreasing のうち1つ以上が指定された場合、最後に指定されたものが優先されます。

**ネストされたリストの指定**

options意味
-index indexListこのオプションが指定された場合、リストの各要素は、それ自身が適切なサブリストでなければなりません。このオプションは、各サブリストからindexListで指定したindex番号の要素を参照して検索します。
-subindices-indexと一緒に指定した場合、リストの最上位の要素ではなく、lindexまたはlsetで使用するindex番号のリストを返します。

※ -index, -subindices, -nocase はtcl8.5で追加されました。

[使用例1]

% set var {a1 a2 a3 b1 b2 c1 c2 c3}
a1 a2 a3 b1 b2 c1 c2 c3

# 最初に見つかった要素のindex番号を返します。
% lsearch $var b*                   ----(1)
3

# pattern に一致したすべてのindex番号をリストで返します。
% lsearch -all $var b*              ----(2)
3 4

# pattern に一致したすべての要素をリストで返します。
% lsearch -all -inline $var b*      ----(3)
b1 b2

# 見つからなかった場合は、-1 を返します。
%lsearch $var d*                    ----(4)
-1

# pattern に一致しなかった要素を返します。
% lsearch -inline -not $var b*      ----(5)
a1

# pattern に一致しなかったすべての要素をリストで返します。
% lsearch -all -inline -not $var b* ----(6)
a1 a2 a3 c1 c2 c3

# 指定した位置から検索します。
% lsearch -not -start 3 $var b*     ----(7)
5

[使用例2]

% set var1 {a1 a2 a3 b1 b2 g1 g2 c1 c2}
a1 a2 a3 b1 b2 g1 g2 c1 c2
% set var2 {a6 a7 a8 a9 a10 a11 a12 a13}
a6 a7 a8 a9 a10 a11 a12 a13

% lsearch $var1 c1
7
% lsearch -sorted $var1 c1      ----(1)
-1

% lsearch -sorted $var2 a12     ----(2)
-1
% lsearch -dictionary $var2 a12 ----(3)
6

[説明]

(1)

-sorted が指定されているので、ソートされているとみなして検索します。(デフォルトではascii順) しかし、var1はa,b,g,cの順に並んでおり、ソートされていないので、c1を見つけることができません。

(2)

-sorted が指定されているので、ソートされているとみなして検索します。(デフォルトではascii順) しかし、var2は辞書順で並んでいる為、a12を見つけることができません。

(3)

-dictionary が指定されているので、辞書順とみなして検索する。

[使用例3]

% set var {a1 a2 A3 b1 b2 B3 c1 c2 C3}
a1 a2 A3 b1 b2 B3 c1 c2 C3

% lsearch -all $var b*
3 4
% lsearch -all $var B*
5
% lsearch -all -nocase $var B*   ----(1)
3 4 5

[説明]

(1)

-nocase を指定すると大文字、小文字を区別しません。

[使用例4]

% set x {{a b c} {d e f} {g h i}}
{a b c} {d e f} {g h i}

% lsearch $x h
-1

% lsearch -index 1 $x h      ----(1)
2
% lsearch -index 2 $x f      ----(2)
1

% set y {{{a b} {c d} {e f}} {{g h} {i j} {k l}}}
{{a b} {c d} {e f}} {{g h} {i j} {k l}}

% lsearch -index {2 0} $y k              ----(3)
1

% lsearch -subindices -index {2 0} $y k  ----(4)
1 2 0
% lsearch -subindices -index {2 0} $y e
0 2 0

[説明]

(1)

-index はサブリストの要素を検索します。

  • リストの各要素は、それ自身が適切なサブリストであること。
  • 指定するindex番号は、サブリストのindex番号。

各要素のサブリストのindex番号:1は「b e h」になります。

pattern に一致する要素が見つかると、その要素が含まれるリストのindex番号を返します。

(2)

各要素のサブリストのindex番号:2は「c f i」になります。

(3)

各要素のサブリストのindex番号:{2 0}は「e k」になります。

(4)

-subindicesを一緒に指定すると、リストの最上位の要素のindex番号ではなく、lindexまたはlsetで使用するindex番号のリストを返します。

このオプションは、「キー、値」が1つの要素になったリストで値の検索やキーを検索するような場合に使用するようです。

例. {{国語 40} {数学 75} {化学 80} {英語 45} {地理 70}}

コメント

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