Ich habe zwei ListenWie eine Liste aus der Liste in tcl entfernen
- Satz a1 {abcdef}
- Satz b1 {BFE}
Ich versuche remove_from_list $a1 $b1 >> {a c d}
Gibt es eine Funktion, die auf Listen auf tcl operieren kann?
Ich habe zwei ListenWie eine Liste aus der Liste in tcl entfernen
Ich versuche remove_from_list $a1 $b1 >> {a c d}
Gibt es eine Funktion, die auf Listen auf tcl operieren kann?
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
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
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
# 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
Bitte erläutern Sie, was Sie hier getan haben, warum haben Sie struct :: set gewählt. –
Die Begrenzung natürlich ist, dass Es wird schwierig sein, mehrere Elemente mit demselben Wert zu haben (nicht in Frage). –