2016-09-23 36 views
0

我在TCL以下数据结构(http://stardict.sourceforge.net/Dictionaries.php下载的列表)更新列表内的字典

列表[{1 A 2 B} {1个C 2 d} {1和E 2 d}]

,你可以看到列表中有三个相同键的字典。

我想更新d,让我们说只有e的P有,否则构造dict {1 e 2 P}并追加到列表中。

无论,我更新或追加,在端我应该有这种

列表[{1 A 2 B} {1个C 2 d} {1e中2个P}]

我知道我可以迭代和实现这一点,但这看起来很丑。有没有更简单的方法来做到这一点。我不是很熟悉TCL先进的字典命令,所以

感谢

回答

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} 
% 
+0

谢谢,但不,我不能这样做,因为我只能搜索1 e,所以elem只能是{1 e},因为我不知道键2的值(这是d中的d例)。任何其他方式? –

+0

如果您只知道元素“1 e”,那么您打算如何更换?如果假设,该字典有多个元素,那么你会怎么做?说,“{1 e 7 m 2 d}”或“{1 e 2 d 4 f}”。 ? – Dinesh

+0

这个字典只会有两个键。 (1和2)。谢谢 –

0

我认为最简单的方法是使用lmap遍历列表,conditi如果它完成了,就会进行字典转换并设置一个标志。然后,如果没有完成这样的更改,请在最后附加新的字典。

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。如果你这样做,代码会更长一些。

+0

谢谢。我做了类似的事情。但如果有的话寻找更简单的东西。 –

+0

@lollahmullah想不到一个;没有人做过一个系统来完成在值内部使用复杂坐标的操作,因为这在实践中并不是一个非常普遍的要求。 –