2011-10-10 18 views
5

Quiero eliminar una sublista de una lista en Tcl. Sé cómo hacerlo para la lista principal usando lreplace pero no sé cómo hacerlo para una sublista. Por ejemplo:eliminar una sublista de la lista en tcl

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

Ahora desea eliminar de la lista interna {4}{ {3 4} {4} }. La lista final debe ser:

a { 1 2 { {3 4} } }

Para sugerir cómo dot suyo.

+1

lo que nos falta es el criterio que necesita para seleccionar el elemento a eliminar, es decir, ¿es siempre la 2da sub-sublista en la 3ª sublista o alguna otra cosa? –

+0

también no lreplace en realidad crea una nueva lista, no lo hace en su lugar reemplace –

+0

criterios es si hay menos de dos elementos en la sublista interna de la lista {{3 4} {4}}, elimínelo. como en {3 4}, tenemos elementos, pero en {4} solo hay un elemento, por lo que necesito eliminar {4}. – Ruchi

Respuesta

2

Combinar lindex para obtener la lista secundaria interna, lreplace eliminar un elemento de la lista secundaria interna extraído y lset para poner la lista secundaria modificada en su lugar.

Pero, sinceramente, tengo la sensación de que algo anda mal con su modelo de datos.

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 
} 

Si necesita profundidades variables, este código lo pierde. Necesitas recursividad para eso.

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

Como la lista externa nunca se muestra en tclsh.

1

Se requiere algunos trucos para hacer muy bien:

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] 

Esto funciona porque ambos lset y lindex puede tomar caminos, y hacen las cosas sensibles con una ruta de vacío también.

+0

Supongo que su problema sería conocer el camino ... y, por lo tanto, tenía que repetir su lista de todos modos para ver qué elemento de su lista/sublista es un valor único (sus criterios). – unNamed

Cuestiones relacionadas