[python] Doble for con break

Iniciado por kaiserr, 30 Mayo 2014, 16:41 PM

0 Miembros y 1 Visitante están viendo este tema.

kaiserr

Hola a todos!

Hoy ataco con una nueva pregunta.
Tengo este codigo:

def main():

lista = [[3,2,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]

for path in lista:
aux = []
for nodo in path:
aux.append(nodo)
if aux.count(nodo) >= 2:
lista.remove(path)
break
     print lista


Es para eliminar sublistas con numeros repetidos de la lista. El problema esta que si tengo varias sublistas con numeros repetidos solo me elimina la primera. Esto sucede por el break que hay dentro de la condicion... pero, yo solo quiero salir del bucle interno :S

hay alguna otra sentencia que me lo permita hacer? o tendre que idear otra manera de hacer la funcion?

Saludos y gracias :)

Shell Root

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

kaiserr

Tambien he probado este codigo sin break, y me pasa lo mismo... asi que me he planteado que sea a causa del remove. Puede ser?


def main():
lista = [[3,2,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]

for path in lista:
aux = []
i = 0
fin = True

while i < len(path) and fin:
aux.append(path[i])
if aux.count(path[i]) >= 2:
lista.remove(path)
fin = False
i = i + 1
print lista

Shell Root

El ultimo que pusiste remueve el "path" que tiene elementos repetidos, es decir,

lista original
[[3,2,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]

lista con path eliminado
[[3,2,1], [4,2,1], [         ], [3,2,7,5,3,1]]

Así que no elimines el path,
lista.remove(path)

Debes de remover el "nodo"
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

kaiserr

Primero de todo gracias por contestar tan rapido :)
Estoy implementando el algoritmo Astar y yo lo que necesito es eliminar la sublista entera.

Al final hice un pequeño truco para poder eliminarlo, os dejo el código para quien le interese. Aun asi, me gustaria saber porque al eliminar la sublista, el bucle ya no detecta las siguientes sublistas.


def main():
lista = [[3,2,1], [1,2,2,3,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]

temp = [] + lista
for path in lista:
aux = []
for nodo in path:
aux.append(nodo)
if aux.count(nodo) >= 2:
temp.remove(path)
break

lista = temp
print lista


Saludos!

Once

Cita de: kaiserr en 30 Mayo 2014, 18:05 PM
Primero de todo gracias por contestar tan rapido :)
Estoy implementando el algoritmo Astar y yo lo que necesito es eliminar la sublista entera.

Al final hice un pequeño truco para poder eliminarlo, os dejo el código para quien le interese. Aun asi, me gustaria saber porque al eliminar la sublista, el bucle ya no detecta las siguientes sublistas.

Debe ser porque estas iterando y modificando al tiempo la misma lista. Se me ocurre que puedes usar el slicing para iterar una copia de la lista original y modificar la original y te puedes ahorrar el "pequeño truco".

Código (python) [Seleccionar]
def yop():
    lista = [[3,2,1], [1,2,2,3,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]
    for path in lista[:]:
        for nodo in path:
            if path.count(nodo) >= 2:
                lista.remove(path)               
                break
    print lista


Saludos!

kaiserr

Gracias 11Sep :)
Entregue el trabajo con el truquillo jaja pero para la proxima lo tendre en cuenta.