在TCL lsort中给出多重性计数的有效方法

时间:2017-06-16 21:48:19

标签: sorting tcl

TCL lsort没有很好的功能来提供多个项目的计数。有快速的选择吗?我们正在查看包含100个相同条目的列表〜1M对象。

blasort -unique -count { 3 2 4 3 1 }
1 : 1
2 : 1
3 : 2 
4 : 1

谢谢, 格特

2 个答案:

答案 0 :(得分:1)

为了计算这样的元素,使用binsort派生算法,使用字典或关联数组作为快速映射,会好得多。即使输入列表非常大,以下内容也应该有效:

proc countSort {elementList args} {
    set count {}
    foreach element $elementList {
        dict incr count $element
    }
    # Now sort the dictionary by the keys (i.e., the unique elements of the input)
    return [lsort -stride 2 -index 0 {*}$args $count]
}

通过从您正在使用的输入列表中再现问题中的输出来演示如何使用它:

set input { 3 2 4 3 1 }
foreach {item count} [countSort $input] {
    puts "$item : $count"
}

答案 1 :(得分:0)

使用数组老式...

 proc count { lista } {
         foreach item $lista {
                incr counter($item)
        }
        return [array get counter];# return a list 
        ;# or showing the result 
        ;#parray counter 
   }