tcl列表中的Groupby名称

时间:2018-04-30 12:35:18

标签: list group-by tcl

我有一个像这样的列表

set a {CSCvi6:sunil CSCvi7:sunil CSCvi8:parames CSCvi87:sunil CSCvi878:sunil CSCvi89:arun CSCvi95:sunil CSCvj3:sunil CSCvj1:arun}

如何通过名称显示列表组,如

sunil:CSCvi6 CSCvi7 CSCvi87 CSCvi878 CSCvi95 CSCvj3
arun:CSCvi89 CSCvj1
parames :CSCvi8

我在tcl中搜索groupby,但遗憾的是我没有发现任何与此类似的内容。帮我做那件事

1 个答案:

答案 0 :(得分:2)

您需要遍历列表并使用dict(或数组)来收集组:

explicit
set a {CSCvi6:sunil CSCvi7:sunil CSCvi8:parames CSCvi87:sunil CSCvi878:sunil CSCvi89:arun CSCvi95:sunil CSCvj3:sunil CSCvj1:arun}
set map [dict create]
foreach pair $a {
    lassign [split $pair :] value name
    dict lappend map $name $value
}
dict for {name values} $map {puts "$name: $values"}

仔细研究一下,我们可以实现一个sunil: CSCvi6 CSCvi7 CSCvi87 CSCvi878 CSCvi95 CSCvj3 parames: CSCvi8 arun: CSCvi89 CSCvj1 过程,该过程采用列表并创建字典

groupby

一个例子,对于从0到9的数字列表,按"模3"

分组
proc groupby {varname lst grouping_code} {
    set result [dict create]
    upvar 1 $varname var
    foreach var $lst {
        set key [uplevel 1 $grouping_code]
        dict lappend result $key $var
    }
    return $result
}

或者,对于你的问题

set groups [groupby n {0 1 2 3 4 5 6 7 8 9} {expr {$n % 3}}]
# {0 {0 3 6 9} 1 {1 4 7} 2 {2 5 8}}

并过滤分组中的名称:

set a {CSCvi6:sunil CSCvi7:sunil CSCvi8:parames CSCvi87:sunil CSCvi878:sunil CSCvi89:arun CSCvi95:sunil CSCvj3:sunil CSCvj1:arun}

set groups [groupby elem $a {lindex [split $elem :] end}]
# {sunil {CSCvi6:sunil CSCvi7:sunil CSCvi87:sunil CSCvi878:sunil CSCvi95:sunil CSCvj3:sunil} parames CSCvi8:parames arun {CSCvi89:arun CSCvj1:arun}}

我从Ruby获得了一些灵感,用于此实现。