【问题标题】:updating a dict inside a list更新列表中的字典
【发布时间】:2017-02-01 03:12:29
【问题描述】:

我在 TCL 中有以下数据结构(字典列表)

列表 [{1 a 2 b} {1 c 2 d} {1 e 2 d}]

如您所见,一个列表中有三个具有相同键的字典。

我想更新 d,假设只有 e 的 P 存在,否则构造字典 {1 e 2 P} 并附加到列表中。

无论是更新还是追加,最后我都应该拥有这个

列表 [{1 a 2 b} {1 c 2 d} {1 e 2 P}]

我知道我可以迭代并实现这一点,但这看起来很难看。有没有更短的方法来做到这一点。我对 TCL 高级 dict 命令不是很熟悉,所以非常感谢任何帮助

谢谢

【问题讨论】:

    标签: list dictionary data-structures tcl


    【解决方案1】:

    方法一:

    % set input
    {1 a 2 b} {1 c 2 d} {1 e 2 d}
    % #index 2 3 points to 'd' 
    % lset x 2 3 P
    {1 a 2 b} {1 c 2 d} {1 e 2 P}
    %
    

    方法二:

    % set input {{1 a 2 b} {1 c 2 d} {1 e 2 d}}
    {1 a 2 b} {1 c 2 d} {1 e 2 d}
    % #The element to search and replace...
    % set elem {1 e 2 d}
    1 e 2 d
    %
    % lset input [lsearch $input $elem] [dict replace $elem 2 P]
    {1 a 2 b} {1 c 2 d} {1 e 2 P}
    %
    

    【讨论】:

    • 谢谢,但不,我不能这样做,因为我只能按 1 e 搜索,所以 elem 只能是 {1 e},因为我不知道键 2 的值,(在示例中为 d)。还有其他方法吗?
    • 如果您只知道元素1 e,那么您打算如何替换?如果假设 dict 有多个元素,那么你会怎么做?比如{1 e 7 m 2 d}{1 e 2 d 4 f}。 ?
    • 这个字典永远只有两个键。 (1和2)。谢谢
    • 为什么问题在 dict 中,有没有办法根据另一个值替换两个 valued-dict 的值。
    【解决方案2】:

    我认为最简单的方法是使用lmap 遍历列表,有条件地进行字典转换并在完成时设置一个标志。然后,如果没有进行此类更改,则在末尾附加新字典。

    set input {{1 a 2 b} {1 c 2 d} {1 e 2 d}}
    
    set replaced 0
    set output [lmap d $input {
        if {[dict exists $d 1] && [dict get $d 1] eq "e"} {
            set replaced 1
            dict set d 2 "P"
        }
        set d
    }]
    if {!$replaced} {
        lappend output [dict create 1 e 2 "P"]
    }
    

    如果您使用的是 8.5,则可以使用 foreachlappend 而不是 lmap。如果你这样做,代码会有点长。

    【讨论】:

    • 谢谢。我做了类似的事情。但如果有的话,寻找更简单的东西。
    • @lollahmullah 想不出一个;没有人做过一个系统来执行在值内部采用复杂坐标的操作,因为这在实践中并不是一个非常普遍的要求。
    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多