更新列表中的dict

时间:2016-09-23 09:47:20

标签: list dictionary data-structures tcl

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

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

正如您所看到的,列表中有三个具有相同键的dicts。

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

是否,我更新或追加,最后我应该有这个

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

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

感谢

2 个答案:

答案 0 :(得分:0)

方法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}
%

方法2:

% 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 :(得分:0)

我认为最简单的方法是使用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。如果你这样做,代码会有点长。