我在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命令不是很熟悉,所以任何帮助都非常感激
感谢
答案 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,则可以使用foreach
和lappend
代替lmap
。如果你这样做,代码会有点长。