从tcl获取嵌套键dict

时间:2017-07-30 06:36:08

标签: tcl

如果我在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

有没有办法直接从这个字典中获取这个值列表?

2 个答案:

答案 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]}]]