web-dev-qa-db-fra.com

TCL supprimer un élément d'une liste

Comment supprimer un élément de la liste TCL:

  1. qui a index = 4 
  2. qui a la valeur = "aa"

J'ai googlé et je n'ai pas encore trouvé de fonction intégrée.

18
Narek
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
39
drysdam

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.)

15
Donal Fellows

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
4
icanhasserver

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
1
Shawn E

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
1
Todd Horst