2016-05-06 13 views
0

リストがあるとします。a b c b b d e e f …とは何種類の要素があるのか​​わかりません。リスト内の一意の要素の数をカウントする

各ユニークエレメントの数を数えてプリントアウトするにはどうすればよいですか? 出力は次のようになります。

 
a: 32 
b: 12 
c: 6 
… 

答えて

2

あなたはそれらを数えなければなりません。これは配列やカウンターの辞書ではそれほど難しいことではありません。それ以来、私は辞書を使用します。それは、最初に出現する順番で印刷されます。 (配列を使用すると、「ランダム」の順序を取得したいか、あなたはそれらをソートする必要があると思います。)

set counters {} 
foreach item $list { 
    dict incr counters $item 
} 
dict for {item count} $counters { 
    puts "${item}: $count" 
} 
+0

ありがとう、これは完璧に動作します – Bryan

+0

'dict'がこれを、ほとんど、8.6の唯一の解決策にしています。多くのプラットフォームではまだ8.5またはそれ以前のバージョンしか提供されていません。代わりに 'array'を使用していました。この目的のためにどちらかがうまくいく。 –

+0

これはどうやって起こりますか? – Bryan

0

あなたはTCLの8.4またはそれ以前のバージョンを使用している場合

set lst "a a a a b b b c c c d d a a a f f f f f s s s s" 

set unique [lsort -unique $lst]  
foreach f $unique { 
    set cnt 0 
    foreach item $lst { 
     if {$item == $f} { 
      incr cnt 
     } 
    } 
    puts "$f :: $cnt" 
} 

、これを試してみてください出力のように、

% tclsh main.tcl 
a :: 7 
b :: 3                                        
c :: 3 
d :: 2                                        
f :: 5 
s :: 4 
0

dictまたはarrayソリューションは、最高の一つであり、優先されなければならない与えます。ソートされたトークンのリストで動作する別の方法は、空白でないトークンの連続した領域に一致させることです。

% regexp -all -inline {(\S+)(?:\s+\1)*} {a a b b b c d d} 
{a a} a {b b b} b c c {d d} d 

結果が交互に一致したトークンの領域及び領域に一致トークンの偶数サイズのリストです。これは、リスト内のトークンの頻度レポートをlistに印刷するために使用できます。

foreach {a b} [regexp -all -inline {(\S+)(?:\s+\1)*} [lsort $list]] { 
    puts "$b: [llength $a]" 
} 

トークンには空白を含めることができないという制限に注意してください。これは克服することができますが、トークンだけが有効なリスト要素であることが必要なarray/dictソリューションを使用する方が簡単です。

ドキュメント:foreachllengthlsortputsSyntax of Tcl regular expressionsregexp

0

それは簡単lsearchとllengthを使用して行うことができます。
C:3
:5
D:0

説明:lsearch -allは、すべて返されます
はあなたのリストは{acacsaaca}そして、

set tempList {a c a c s a a c a} 
puts "c : [llength [lsearch -all $tempList c]]" 
puts "a : [llength [lsearch -all $tempList a]]" 
puts "d : [llength [lsearch -all $tempList d]]" 

出力であると言うことができます一致する要素のインデックス とこのインデックスのリストはリストの長さを数えるllengthに返されます。

関連する問題