2010-05-24 10 views
8

Tengo una pregunta sobre la construcción de bucle en Python en la forma de: for x in y: En mi caso, y es una línea leída de un archivo yx es caracteres separados. Me gustaría poner un espacio después de cada par de caracteres en la salida, como este: aa bb cc dd etc. Por lo tanto, me gustaría saber la iteración actual. ¿Es posible, o necesito usar un estilo C más tradicional para el ciclo con un índice?para x en y, tipo de iteración en python. ¿Puedo averiguar en qué iteración estoy actualmente?

Respuesta

21
for i,x in enumerate(y): 
    .... 
+0

Gracias, eso es maravilloso. – foo

+0

Por cierto, ¿es un buen estilo poner un espacio entre la coma después de la i y la x? –

+0

Sí, es un buen estilo pero un espacio entre el i y el x. –

1

Uso enumerate:

for index,x in enumerate(y): 
    # do stuff, on iteration #index 

Alternativamente, basta con crear una variable y se incrementa en el interior del cuerpo del bucle. Sin embargo, esto no es tan 'pitónico'.

cur = 0 
for x in y: 
    cur += 1 
    # do stuff, on iteration #cur 
+6

'cur ++' es tan antipático que da un error de sintaxis, por lo que difícilmente puede recomendarse ;-). Creo que te refieres a 'cur + = 1' (que al menos funciona, aunque es sucio cuando se lo compara con enumerar ;-). –

+0

Gracias. Terminé usando enumerar. Sin embargo, no estoy seguro si hace alguna diferencia, ¿pero quizás el recuento manual sea más claro? Ejem, ok al menos para alguien que no está muy familiarizado con Python, mirando el código. – foo

+0

@ Alex, sí, de hecho acabo de mudarme a un apt. así que estoy un poco agotado ahora mismo. (Y sí, 'enumerar' es mucho más bonito.) – Amber

0

Si lo que está haciendo es insertar un espacio después de cada par de caracteres, es posible que desee hacer algo con las listas por comprensión como:

' '.join([''.join(characterPair) for characterPair in zip(*[iter(line + ' ')] * 2)]) 

sin anexar el espacio adicional, el último carácter de las líneas con un número impar de caracteres se eliminarán; con el espacio adjunto, las líneas con un número impar de caracteres tendrán un espacio adicional al final.

(bien puede haber una manera más Pythonic de hacerlo que lo que he hecho.)

0

Realmente no se puede argumentar que esto es mejor que el método enumerate, pero es menos evidente a alguien que viene de una perspectiva de C, por lo que pensé en señalarlo esté completo:

from itertools import izip_longest 
' '.join(j + k for j,k in izip_longest(fillvalue='', *([iter(line)]*2))) 

en Python se prefiere a menudo (o al menos animado a) hacer algo con generadores o listas por comprensión de este tipo, en vez de confiar en enumerate.

Esta es una variación del método grouper del itertools module documentation.

Cuestiones relacionadas