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

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?

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.

También puede usar esta syntax ( 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 de inicio (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.

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.

Si está utilizando Python 2.6 o más reciente, puede usar la receta 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 .

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

Un poco sucio pero funciona.

Esto podría no ser tan rápido como la solución izip_longest (en realidad no lo 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.

Si tiene el control sobre la estructura de la lista, lo más útil que podría hacer un python 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