number loop index from for python list loops for-loop iteration

python - loop - ¿Cómo puedo recorrer una lista de dos en dos?



range number python (7)

Esto podría no ser tan rápido como la solución izip_longest (en realidad no la probé), pero funcionará con python <2.6 (se agregó izip_longest en 2.6):

from itertools import imap def grouper(n, iterable): "grouper(3, ''ABCDEFG'') --> (''A,''B'',''C''), (''D'',''E'',''F''), (''G'',None,None)" args = [iter(iterable)] * n return imap(None, *args)

Si necesita ir antes de la versión 2.3, puede sustituir el mapa integrado por imap. La desventaja es que no proporciona la capacidad de personalizar el valor de relleno.

Posible duplicado:
¿Cuál es la forma más "pythonic" de iterar sobre una lista en trozos?

Quiero recorrer una lista de Python y procesar 2 elementos de lista a la vez. Algo así en otro idioma:

for(int i = 0; i < list.length(); i+=2) { // do something with list[i] and list[i + 1] }

¿Cuál es la mejor manera de lograr esto?


Lo más simple en mi opinión es esto:

it = iter([1,2,3,4,5,6]) for x, y in zip(it, it): print x, y

No hay importaciones extra ni nada. Y muy elegante, en mi opinión.


Puedes usar para en rango con un tamaño de paso de 2:

Python 2

for i in xrange(0,10,2): print(i)

Python 3

for i in range(0,10,2): print(i)

Nota: Use xrange en Python 2 en lugar de rango porque es más eficiente ya que genera un objeto iterable, y no toda la lista.


Si está utilizando Python 2.6 o más reciente, puede usar la recipe de itertools módulo itertools :

from itertools import izip_longest def grouper(n, iterable, fillvalue=None): "grouper(3, ''ABCDEFG'', ''x'') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args)

Llama así:

for item1, item2 in grouper(2, l): # Do something with item1 and item2

Tenga en cuenta que en Python 3.x debe usar zip_longest lugar de izip_longest .


Si tiene el control sobre la estructura de la lista, lo más útil que podría hacer un pitón sería cambiarlo desde:

l=[1,2,3,4]

a:

l=[(1,2),(3,4)]

Entonces, tu bucle sería:

for i,j in l: print i, j


También puede usar esta sintaxis ( L[start:stop:step] ):

mylist = [1,2,3,4,5,6,7,8,9,10] for i in mylist[::2]: print i, # prints 1 3 5 7 9 for i in mylist[1::2]: print i, # prints 2 4 6 8 10

Donde el primer dígito es el índice inicial (predeterminado al comienzo de la lista o 0), el segundo es el índice de división final (predeterminado al final de la lista) y el tercer dígito es el desplazamiento o paso.


nums = range(10) for i in range(0, len(nums)-1, 2): print nums[i]

Un poco sucio pero funciona.