J'ai deux listesComment supprimer une liste de la liste dans tcl
- set a1 {abcdef}
- ensemble b1 {BFE}
Je suis en train de faire remove_from_list $a1 $b1 >> {a c d}
Y a-t-il une fonction qui peut fonctionner sur les listes sur tcl?
J'ai deux listesComment supprimer une liste de la liste dans tcl
Je suis en train de faire remove_from_list $a1 $b1 >> {a c d}
Y a-t-il une fonction qui peut fonctionner sur les listes sur tcl?
set mylist {a b c}
puts $mylist
a b c
Supprimer par index
set mylist [lreplace $mylist 2 2]
puts $mylist
a b
Retirer en valeur
set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist
a
Pour commencer, vous ne pouvez pas utiliser des crochets pour les littéraux de liste. Les parenthèses sont utilisées pour la substitution de commandes dans Tcl.
Au lieu de cela, utilisez la commande de prise de liste, list
% set a1 [list a b c d e f]
a b c d e f
Ou, plus ou moins équivalente:
% set b1 {b f e}
b f e
Il n'y a pas de commande standard pour soustraire une liste d'une autre. Cependant, il est très facile de construire un filtre.
Vous pouvez filtrer les articles dans a1
qui sont b1
par un filtre lmap
(carte de liste):
lmap item $a1 {
if {$item ni $b1} {
set item
} else {
continue
}
}
# results in
a c d
La commande if
l'intérieur du corps lmap
détermine si un article est pas dans (ni
) $b1
. Si cela est vrai, la valeur de l'élément devient une partie du résultat. Si c'est faux, l'élément est ignoré.
Dans Tcl 8.5 et antérieur, il n'y a pas de lmap
. Dans ce cas, on peut copier-coller un ersatz lmap
(fonctionne de la même manière) dans le code: lien ci-dessous.
Ou, on peut utiliser foreach
à la place. C'est un peu désordonné mais ça marche.
set res {}
foreach item $a1 {
if {$item ni $b1} {
lappend res $item
}
}
% set res
a c d
Documentation: continue, foreach, if, lappend, list, lmap (for Tcl 8.5), lmap, ni (operator), set
Vous pouvez également utiliser un tableau.Il est facile d'ajouter et de supprimer des éléments
% foreach elem $a1 {set x($elem) 1}
% foreach elem $b1 {unset x($elem)}
% set result [array names x]
d a c
C'est aussi une approche très efficace, un seul passage dans chaque liste.
Ou utiliser un dictionnaire pour maintenir l'ordre d'insertion d'origine:
% foreach elem $a1 {dict set y $elem 1}
% foreach elem $b1 {dict unset y $elem}
% set result [dict keys $y]
a c d
# avec struct :: set de 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
Veuillez expliquer ce que vous avez fait ici, pourquoi avez-vous choisi struct :: set. –
La limitation étant bien entendu que il sera difficile d'avoir plusieurs éléments avec la même valeur (pas en question). –