2017-09-16 8 views

Antwort

0
   set mylist {a b c} 
       puts $mylist 
       a b c 

Entfernen von Index

   set mylist [lreplace $mylist 2 2] 
       puts $mylist 
       a b 

Entfernen von Wert

   set idx [lsearch $mylist "b"] 
       set mylist [lreplace $mylist $idx $idx] 
       puts $mylist 
       a 
1

mit zu beginnen, können Sie nicht Klammern für Liste Literale verwenden. Klammern werden für die Befehlsersetzung in Tcl verwendet.

Verwenden Sie stattdessen die Liste Fassungs Befehl, list

% set a1 [list a b c d e f] 
a b c d e f 

Oder mehr oder weniger äquivalent:

% set b1 {b f e} 
b f e 

Es gibt keinen Standard-Befehl eine Liste von einem anderen zu subtrahieren. Es ist jedoch sehr einfach, einen Filter zu erstellen.

Sie können Elemente in a1 herauszufiltern, die in b1 durch eine lmap (Liste anzeigen) Filter sind:

lmap item $a1 { 
    if {$item ni $b1} { 
     set item 
    } else { 
     continue 
    } 
} 

# results in 
a c d 

Der if Befehl innerhalb des lmap Körper bestimmt, ob ein Artikel ist nicht in (ni) $b1. Wenn dies der Fall ist, wird der Wert des Elements Teil des Ergebnisses. Wenn es falsch ist, wird das Element übersprungen.

In Tcl 8.5 und früher gibt es keine lmap. In diesem Fall kann man einen Ersatz lmap (funktioniert gleich) in den Code: Link unten kopieren.

Oder man kann stattdessen foreach verwenden. Es ist ein bisschen unordentlicher, aber funktioniert.

set res {} 
foreach item $a1 { 
    if {$item ni $b1} { 
     lappend res $item 
    } 
} 

% set res 
a c d 

Dokumentation: continue, foreach, if, lappend, list, lmap (for Tcl 8.5), lmap, ni (operator), set

3

Sie können auch ein Array.Es ist einfach, Elemente hinzuzufügen und zu entfernen

% foreach elem $a1 {set x($elem) 1} 
% foreach elem $b1 {unset x($elem)} 
% set result [array names x] 
d a c 

Es ist eine ziemlich effiziente Annäherung auch, nur ein einzelner Durchlauf durch jede Liste.

Oder ein Wörterbuch verwenden, um den ursprünglichen Auftrag zu erhalten:

% foreach elem $a1 {dict set y $elem 1} 
% foreach elem $b1 {dict unset y $elem} 
% set result [dict keys $y] 
a c d 
+2

Die Begrenzung natürlich ist, dass Es wird schwierig sein, mehrere Elemente mit demselben Wert zu haben (nicht in Frage). –

1

# mit struct :: set von tcllib

package require struct::set 
set a1 {a b c d e f} 
set b1 {b f e} 
struct::set difference $a1 $b1 

# result in 
d a c 

Dokumentation: struct::set

+0

Bitte erläutern Sie, was Sie hier getan haben, warum haben Sie struct :: set gewählt. –

Verwandte Themen