2016-09-23 79 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想不到一個;沒有人做過一個系統來完成在值內部使用複雜座標的操作,因爲這在實踐中並不是一個非常普遍的要求。 –