2017-09-16 1 views

Répondre

0
   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 
1

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

3

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 
+2

La limitation étant bien entendu que il sera difficile d'avoir plusieurs éléments avec la même valeur (pas en question). –

1

# 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

+0

Veuillez expliquer ce que vous avez fait ici, pourquoi avez-vous choisi struct :: set. –