Python: For-loop no terminará

Antes de comenzar, permítanme decir que soy realmente nuevo en la programación, así que no me maten.

Como ejercicio, escribí un script que se supone que debe tomar una lista de números hexadecimales de un txt, convertirlos a decimales y escribirlos en otro archivo. Esto es lo que se me ocurrió:

hexdata = open(raw_input("Sourcefile:")).read().split(',')
dec_data = []

print hexdata
x = -1
for i in hexdata:
    next_one = hexdata.pop(x+1)
    decimal = int(next_one, 16)
    print "Converting: ", next_one, "Converted:", decimal
    dec_data.append(decimal)

print dec_data

target = open(raw_input("Targetfile: "), 'w')
for n in dec_data:
    output = str(n)
    target.write(output)
    target.write(",")

Cuando ejecuto el script, termina sin errores, sin embargo, solo convierte y escribe los primeros 30 números de mi archivo fuente e ignora todos los demás, aunque estén cargados en la lista de 'datos hexadecimales'. He probado varias variaciones pero nunca funciona con todos los números (48). ¿Qué estoy haciendo mal?

preguntado el 03 de mayo de 12 a las 22:05

hexdata.pop(x+1) parece extraño... -

2 Respuestas

Su primer ciclo está tratando de iterar sobre hexdata, mientras que al mismo tiempo extrae valores de la lista usando hexdata.pop(). Simplemente cámbielo a algo como:

for next_one in hexdata:
    decimal = int(next_one, 16)
    print "Converting: ", next_one, "Converted:", decimal
    dec_data.append(decimal)

contestado el 03 de mayo de 12 a las 22:05

Gracias, no sabía que eso causaría un problema. - Anteras

El principio cuando se itera sobre listas es no modificar la lista sobre la que se está iterando. Si es necesario, puede hacer una copia de la lista para iterar.

for i in hexdata[:]: # this creates a shallow copy, or a slice of the entire list
    next_one = hexdata.pop(x+1)
    decimal = int(next_one, 16)
    print "Converting: ", next_one, "Converted:", decimal
    dec_data.append(decimal)

También puede crear una copia profunda usando copy.deepcopy, lo que le permitirá evitar los problemas planteados en copias superficiales, como hexdata[:].

contestado el 03 de mayo de 12 a las 23:05

Me gustaria notar que hexdata[:] is no una copia profunda (no es que necesite una aquí, pero es engañoso decir que es una). Esa es una copia superficial. Para una copia profunda, necesita copy.deepcopy(). Además, incluso para una copia superficial, esa es una sintaxis poco clara. list(hexdata) or copy.copy(hexdata) sería mejor para una copia superficial. - gareth latty

Tienes razón @Lattyware, actualizaré mi respuesta para reflejar eso. - Makoto

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.