计算列表中唯一元素的数量

时间:2016-05-06 01:42:26

标签: tcl

说我有一个列表,a b c b b d e e f …,我不知道有多少种不同的元素。

如何计算每个独特元素的数量并将其打印出来? 输出看起来像:

a: 32
b: 12
c: 6
…

4 个答案:

答案 0 :(得分:3)

你必须数出它们。对于数组或计数器字典,这不是太难。我将使用字典从那时起它们将按照第一次出现的顺序打印。 (使用数组,您将获得“随机”订单,或者您必须对它们进行排序。)

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

答案 1 :(得分:1)

使用lsearch和llength可以轻松完成 让我们说你的清单是{a c a c s a a c a}然后,

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]]"  

输出:
c:3
a:5
d:0

说明:lsearch -all,将返回匹配元素的所有索引 并且这个索引列表返回到llength,它将计算列表的长度。

答案 2 :(得分:0)

如果您有8.4或更早版本的TCL,请尝试此操作

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

答案 3 :(得分:0)

dictarray解决方案是最好的解决方案,应该首选。对排序的令牌列表起作用的另一种方法是匹配非空白令牌的连续区域。

% 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]"
}

请注意令牌不能包含空格的限制。这可以克服,但使用只需要令牌是有效列表元素的数组/字典解决方案更简单。

文档:foreachllengthlsortputsSyntax of Tcl regular expressionsregexp