2016-09-23 1 views
0

У меня есть следующие структуры данных в TCL (список dicts)обновление Dict внутри списка

список [{1 A 2 B} {1 C 2 D} {1 е 2 д}]

, как вы можете видеть, есть три диктофона с теми же ключами внутри списка.

Я хочу обновить d с, давайте скажем, что P только из e, иначе постройте dict {1 e 2 P} и добавьте в список.

ли я обновить или добавить, в конце я должен иметь этот список

[{1 A 2 B} {1 C 2 D} {1 е 2 Р}]

Я знаю, может повторять и достигать этого, но это кажется уродливым. есть ли более короткий метод для этого. Я не очень хорошо знаком с командами передового Dict 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, так что элем может быть только {1 e}, так как я не знаю значения для ключа 2 (который равен d в пример). Любым другим путем ? –

+0

Если вы знаете только элемент '1 e', то как вы собираетесь его заменять? Если предположим, что у dict есть несколько элементов, то что бы вы сделали? Скажем, '{1 e 7 m 2 d}' или '{1 e 2 d 4 f}'. ? – Dinesh

+0

Этот дикт будет иметь только два ключа. (1 и 2). спасибо –

0

I думаю, самый простой способ - использовать 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, вы можете использовать foreach и lappend вместо lmap. Если вы это сделаете, код немного дольше.

+0

спасибо. Я сделал что-то подобное. но ищет что-то гораздо более простое, если оно есть. –

+0

@lollahmullah Не может думать об одном; никто не делал систему для выполнения операций, которые принимают сложные координаты внутри значений, поскольку это не то, что на практике является очень распространенным требованием. –