我有一个像这样的列表
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
,但遗憾的是我没有发现任何与此类似的内容。帮我做那件事
答案 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获得了一些灵感,用于此实现。