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.