TCL supprimer un élément d'une liste

Comment te supprimer un élément d'une liste TCL dire:

  1. qui a un indice = 4
  2. qui a une valeur = "aa"

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

18
demandé sur David Hedlund 2011-04-18 15:06:39

5 réponses

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
38
répondu drysdam 2011-05-11 12:10:25

L'autre façon de supprimer un élément de filtre. Cette technique Tcl 8.5 diffère de la lsearch&lreplace méthode mentionnée ailleurs en ce qu'elle supprime 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 les listes imbriquées. C'est une conséquence du fait que Tcl ne met pas trop d'efforts pour comprendre vos structures de données. (Vous pouvez lui dire de rechercher en comparant des éléments spécifiques des sous-listes cependant, via le -index option.)

15
répondu Donal Fellows 2011-04-18 22:06:13

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
répondu icanhasserver 2011-04-18 11:10:04

regsub peut aussi être approprié 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
répondu Shawn E 2014-07-03 13:05:31

tout Juste de terminer ce que les 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
répondu Todd Horst 2015-04-23 19:50:27