Comment supprimer un élément de la liste TCL:
J'ai googlé et je n'ai pas encore trouvé de fonction intégrée.
set mylist {a b c}
puts $mylist
a b c
Supprimer par index
set mylist [lreplace $mylist 2 2]
puts $mylist
a b
Supprimer par valeur
set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist
a
L'autre moyen de supprimer un élément consiste à le filtrer. Cette technique Tcl 8.5 diffère de la méthode lsearch
& lreplace
mentionnée ailleurs en ce qu'elle supprime all d'un élément donné de la liste.
set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove]
Ce qu'il ne fait pas, c'est chercher dans des listes imbriquées. C’est une conséquence du fait que Tcl ne s’efforce pas de comprendre trop profondément vos structures de données. (Vous pouvez toutefois lui demander de rechercher en comparant des éléments spécifiques des sous-listes, via l'option -index
.)
Disons que vous voulez remplacer l'élément "b":
% set L {a b c d}
a b c d
Vous remplacez le premier élément 1 et le dernier élément 1 par rien:
% lreplace $L 1 1
a c d
regsub
peut également convenir pour supprimer une valeur d'une liste.
set mylist {a b c}
puts $mylist
a b c
regsub b $mylist "" mylist
puts $mylist
a c
llength $mylist
2
Vient de terminer ce que d'autres ont fait
proc _lremove {listName val {byval false}} {
upvar $listName list
if {$byval} {
set list [lsearch -all -inline -not $list $val]
} else {
set list [lreplace $list $val $val]
}
return $list
}
Alors appelez avec
Inline edit, list lappend
set output [list 1 2 3 20]
_lremove output 0
echo $output
>> 2 3 20
Set output like lreplace/lsearch
set output [list 1 2 3 20]
echo [_lremove output 0]
>> 2 3 20
Remove by value
set output [list 1 2 3 20]
echo [_lremove output 3 true]
>> 1 2 20
Remove by value with wildcar
set output [list 1 2 3 20]
echo [_lremove output "2*" true]
>> 1 3