【问题标题】:How to set or lappend at nth level in dictionary?如何在字典中设置或覆盖第 n 级?
【发布时间】:2021-12-16 14:21:32
【问题描述】:
dict set X 1 2 3 4
>> X = 1 {2 {3 4}}
  1. 现在经过一些计算,发现 5 和 6 应该是下一个两个值,需要在字典中插入 56,这样 X = 1 {2 {3 {4 {5 6}}}}。如何使用本机 dict 一班轮命令来做到这一点? 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 x,使用本机单行dict 命令? dict lappend X 1 2 3 x 在这种情况下没有帮助。

请注意,X 应设置为初始值,然后才需要使用 dict one liner 命令以上述方式添加元素。

【问题讨论】:

  • 在 dict 内部作为单个命令并没有任意附加内容,因为存在语法歧义,只有通过使更常见的用例变得非常丑陋才能解决。因此,您需要使用带有dict update 和/或dict with 的复合解决方案。或者手动操作。

标签: tcl


【解决方案1】:

添加新的嵌套键

当你开始

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}}}

【讨论】:

  • 或者,dict set X 1 2 3 [dict create 4 {5 6}]
  • 嗨克里斯,谢谢你的时间,但基本上以下是要求:我确实有这个1 {2 {3 4}},现在我需要这个1 {2 {3 {4 {5 6}}}},只使用本机字典一个班轮。类似地,我有这个 1 {2 {3 4}} a {b {c d}} 并希望使用本机 dict 一个线性命令来拥有这个 1 {2 {3 {4 x}}} a {b {c d}}
  • 请解释什么是本机 dict one liner 命令......为什么这是一个关键要求?可以使用dict with X 1 2 {lappend 3 x} 附加到示例中的嵌套键列表。这就是所有本地 Tcl 并且在一行中。这有什么问题?
  • 浪费了试图运行脚本并将数据存储在 dict 中。我在尝试在嵌套字典中添加新数据时遇到问题。在这里,我只是以简单的方式提出了所有查询,并带有约束来模仿我所面临的问题。
  • 我不明白为什么 dict set X 1 2 3 [dict create 4 {5 6}]dict with X 1 2 {lappend 3 x} 不能让您满意。这两个都是本地 Tcl 命令,适合一行,也可以在您指定的初始条件下工作。请解释一下。
猜你喜欢
  • 2013-01-21
  • 2018-10-07
  • 1970-01-01
  • 2012-08-10
  • 2011-03-24
  • 2011-01-02
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多