25 votes

TCL supprime un élément d'une liste

Comment enlever un élément d'une liste TCL :

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

J'ai fait des recherches sur Google et je n'ai pas encore trouvé de fonction intégrée.

53voto

drysdam Points 3266
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

17voto

Donal Fellows Points 56559

L'autre façon d'éliminer un élément est de le filtrer. Cette technique Tcl 8.5 diffère de la méthode lsearch & lreplace mentionnée ailleurs, en ce sens qu'elle supprime les tous d'un élément donné de la liste.

set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove]

En revanche, il ne permet pas d'effectuer des recherches dans des listes imbriquées. C'est une conséquence du fait que Tcl ne s'efforce pas de comprendre vos structures de données en profondeur. (Vous pouvez cependant lui demander de chercher en comparant des éléments spécifiques des sous-listes, via la commande -index option.)

4voto

icanhasserver Points 545

Supposons que vous souhaitiez 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

2voto

Shawn E Points 21

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

1voto

Todd Horst Points 272

Je n'ai fait que reprendre 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
}

Puis suivre 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X