如何在字典的第n级设置或追加?

How to set or lappend at nth level in dictionary?

dict set X 1 2 3 4
>> X = 1 {2 {3 4}}
  1. 现在经过一些计算,发现5和6应该是下两个值,需要在dict中插入56使得X = 1 {2 {3 {4 {5 6}}}}。如何使用本机 dict one liner 命令来做到这一点? dict set 1 2 3 4 5 6 在这种情况下没有帮助。
dict set X 1 2 3 4 
dict set X a b c d 
>> X = 1 {2 {3 4}} a {b {c d}}
  1. 在上述情况下,如何将 x4 重叠,以便在使用本机单行字典命令执行 dict get $X 1 2 3 时返回 4 xdict lappend X 1 2 3 x 在这种情况下没有帮助。

请注意,X应该设置为初始值,只有在初始值之后才需要使用dict one liner命令按照上述方式添加元素。

添加新的嵌套键

当你开始时

tcl8.6.8> dict set X 1 2 3 4
1 {2 {3 4}}

...您指定嵌套键 3 下的值是单个值,而不是字典本身。

如果您尝试在 3 下添加嵌套键,则 Tcl 将尝试为 3 的值创建一个字典,但它无法成功转换现有值 4写成字典。

tcl8.6.8> dict set X 1 2 3 8 9
missing value to go with key

以上错误提示键 4 没有值。这相当于尝试 dict get 4.

解决方案是将 4 初始化为嵌套键,并将空列表作为其值,而不仅仅是 3 下的值。一旦 4 是具有相应值的有效键,您就可以用其他值替换该值。

tcl8.6.8> unset X
tcl8.6.8> dict set X 1 2 3 4 {}
1 {2 {3 {4 {}}}}
tcl8.6.8> dict set X 1 2 3 4 5 6
1 {2 {3 {4 {5 6}}}}

附加到嵌套键

dict lappend 命令不会附加到嵌套键下的列表。当您说 dict lappend X key1 key2 val_to_append 时,您将 key2val_to_append 都附加到 key1 的值。只有 dictvarname 之后的第一个参数被识别为键。其余参数都是要附加到列表的值。

要附加到嵌套键下的值,您可以使用 dict with。 例如。

tcl8.6.8> dict set X 1 2 3 4
1 {2 {3 4}}
tcl8.6.8> dict with X 1 2 {lappend 3 x y}
4 x y
tcl8.6.8> puts $X
1 {2 {3 {4 x y}}}