2011-10-10 16 views
5

Voglio rimuovere una sottolista da una lista in Tcl. So come farlo per la lista principale usando lreplace ma non so come farlo per una sottolista. Per esempio:rimuovere una sottolista dalla lista in tcl

set a { 1 2 { {3 4} { 4 } } } 

Ora voglio per rimuovere {4} dalla lista interna { {3 4} {4} }. La lista finale dovrebbe essere:

a { 1 2 { {3 4} } }

Si prega di suggerire come dot sua.

+1

quello che ci manca è il criterio necessario per selezionare l'elemento da rimuovere, cioè è sempre la seconda lista sub-sub della terza sottolista o qualcos'altro? –

+0

anche not lreplace crea effettivamente un nuovo elenco, non sostituisce un criterio sostitutivo –

+0

se ci sono meno di due elementi nella sottolista interna della lista {{3 4} {4}}, rimuovilo. come in {3 4}, abbiamo gli elementi ma in {4} c'è solo un elemento quindi ho bisogno di rimuovere {4}. – Ruchi

risposta

2

Combina lindex per ottenere la sottolista interna, lreplace per eliminare un elemento della sottolista interna estratto e lset di mettere la sottolista modificato al suo posto.

Ma sinceramente ho la sensazione che ci sia qualcosa che non va nel tuo modello di dati.

1
proc retlist {a} { 
    set nl "" 
    foreach i $a { 
     if {[llength $i] > 1} { 
      set nl2 "" 
      foreach i2 $i { 
       if {[llength $i2] > 1} { lappend nl2 $i2 } 
      } 
      lappend nl $nl2 
     } else { 
      lappend nl $i 
     } 
    } 
    return $nl 
} 

Se è necessaria una profondità variabile, questo codice si perde. Hai bisogno di una ricorsione per quello.

% set a {1 2 {{3 4} {5}}} 
1 2 {{3 4} {5}} 
% retlist $a 
1 2 {{3 4}} 

Come elenco esterno non viene mai visualizzato in tclsh.

1

Si richiede alcuni trucchi per fare bene:

proc lremove {theList args} { 
    # Special case for no arguments 
    if {[llength $args] == 0} { 
     return {} 
    } 
    # General case 
    set path [lrange $args 0 end-1] 
    set idx [lindex $args end] 
    lset theList $path [lreplace [lindex $theList $path] $idx $idx] 
} 

set a [lremove $a 2 1] 

Questo funziona perché entrambi lset e lindex può prendere strade, e lo fanno cose sensibili con un percorso vuoto troppo.

+0

Credo che il suo problema sarebbe stato conoscere il percorso ... e quindi aveva bisogno di fare il ciclo della sua lista in ogni caso per vedere quale elemento della sua lista/sottolista è un singolo valore (i suoi criteri). – unNamed

Problemi correlati