如果我在Tcl中有嵌套的dict,那么
dict set mydict1 A key1 value1
dict set mydict1 B key1 value1
dict set mydict1 B key2 value2
dict set mydict1 C key3 value3
我想识别这本词典中所有二级密钥的列表。在这种情况下,我想知道第二级键是key1,key2,key3
有没有办法直接从这个字典中获取这个值列表?
答案 0 :(得分:2)
没有用于执行此操作的内置命令,甚至代码中的代码也无法知道结构是什么(这是Tcl中类型系统的结果)。但是,如果您知道肯定总有两个级别,那么自己编写代码并不难。
proc two-level-enumerate {dict} {
set keypairs {}
dict for {key1 subdict} $dict {
foreach key2 [dict keys $subdict] {
lappend keypairs [list $key1 $key2]
### Depending on what you're doing, you might prefer:
# lappend keypairs $key1 $key2
}
}
return $keypairs
}
通用Tcl层的棘手的一点是知道有两个级别,因为它不能安全地使用值的内部类型(文字的类型非常棘手,另一方面,确定预期的结构vs你碰巧放在它下面的东西也很尴尬。明确 - 上面的代码 - 效果更好。
答案 1 :(得分:0)
感谢Donal,我能够进一步将解决方案改进为以下内容(对于lmap,要求tcl> = 8.6):
lsort -unique [concat {*}[lmap k1 [dict keys $mydict1] {dict keys [dict get $mydict1 $k1]}]]