Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: kaiserr en 30 Mayo 2014, 16:41 pm



Título: [python] Doble for con break
Publicado por: kaiserr en 30 Mayo 2014, 16:41 pm
Hola a todos!

Hoy ataco con una nueva pregunta.
Tengo este codigo:
Código:
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 :)


Título: Re: [python] Doble for con break
Publicado por: Shell Root en 30 Mayo 2014, 17:02 pm
Espera ya lo vi bien ajjaja


Título: Re: [python] Doble for con break
Publicado por: kaiserr en 30 Mayo 2014, 17:11 pm
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?

Código:
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


Título: Re: [python] Doble for con break
Publicado por: Shell Root en 30 Mayo 2014, 17:39 pm
El ultimo que pusiste remueve el "path" que tiene elementos repetidos, es decir,

lista original
Código:
[[3,2,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]

lista con path eliminado
Código:
[[3,2,1], [4,2,1], [         ], [3,2,7,5,3,1]]

Así que no elimines el path,
Código:
lista.remove(path)

Debes de remover el "nodo"


Título: Re: [python] Doble for con break
Publicado por: 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.

Código:
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!


Título: Re: [python] Doble for con break
Publicado por: Once en 2 Junio 2014, 03:03 am
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
  1. def yop():
  2.    lista = [[3,2,1], [1,2,2,3,1], [4,2,1], [5,2,3,2,1], [3,2,7,5,3,1]]
  3.    for path in lista[:]:
  4.        for nodo in path:
  5.            if path.count(nodo) >= 2:
  6.                lista.remove(path)                
  7.                break
  8.    print lista

Saludos!


Título: Re: [python] Doble for con break
Publicado por: kaiserr en 4 Junio 2014, 02:07 am
Gracias 11Sep :)
Entregue el trabajo con el truquillo jaja pero para la proxima lo tendre en cuenta.