2016-09-23 13 views
0

I haben die Struktur folgende Daten in TCL (Liste der dicts)eine dict innerhalb einer Liste aktualisieren

Liste [{1 a 2 b} {1 c 2 d} {1 e 2 d}]

Wie Sie sehen können, gibt es drei Dicts mit den gleichen Schlüsseln in einer Liste.

Ich möchte d mit aktualisieren, sagen wir P nur von e ist da, sonst konstruiere das dict {1 e 2 P} und an die Liste anhängen.

Ob ich aktualisieren oder fügen Sie am Ende soll ich dieses haben

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

Ich weiß, ich kann iterieren und dies erreichen, aber das scheint hässlich. Gibt es dafür eine kürzere Methode? Ich bin nicht sehr vertraut mit TCL erweiterte dict Befehle, so dass jede Hilfe sehr geschätzt

dank

Antwort

0

Ansatz 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} 
% 

Ansatz 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

danke, aber nein, das kann ich nicht, da ich nur nach 1 e suchen kann, also kann das Element nur {1 e} sein, da ich den Wert für Schlüssel 2 nicht kenne (was d in der Beispiel). auf andere Weise? –

+0

Wenn Sie nur das Element '1e' kennen, wie möchten Sie es ersetzen? Wenn das Diktat mehrere Elemente hat, was würden Sie dann tun? Sage: '{1 e 7 m 2 d}' oder '{1 e 2 d 4 f}'. ? – Dinesh

+0

Dieses Diktat wird nur zwei Schlüssel haben. (1 und 2). Danke –

0

I denke, der einfachste Weg ist, lmap zu verwenden, um über die Liste, conditi zu iterieren only die Wörterbuchtransformation durchführen und ein Flag setzen, wenn es jemals fertig ist. Wenn keine Änderung vorgenommen wurde, fügen Sie das neue Wörterbuch am Ende an.

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"] 
} 

Wenn Sie 8.5 verwenden sind, können Sie foreach und lappend statt lmap verwenden. Der Code ist ein bisschen länger, wenn Sie es tun.

+0

danke. Ich habe etwas ähnliches gemacht. aber nach etwas viel einfacherem suchen, wenn es eins gibt. –

+0

@lollahmullah Kann nicht an einen denken; Niemand hat ein System zum Ausführen von Operationen ausgeführt, die komplizierte Koordinaten innerhalb von Werten verwenden, da dies in der Praxis nicht sehr häufig vorkommt. –

Verwandte Themen