marvin_yorke
¿Es posible iterar una lista de la siguiente manera en Python (tratar este código como un pseudocódigo)?
a = [5, 7, 11, 4, 5]
for v, w in a:
print [v, w]
Y debería producir
[5, 7]
[7, 11]
[11, 4]
[4, 5]
hluk
Puede zip
la lista consigo misma sin el primer elemento:
a = [5, 7, 11, 4, 5]
for previous, current in zip(a, a[1:]):
print(previous, current)
Esto funciona incluso si su lista no tiene elementos o solo 1 elemento (en cuyo caso zip
devuelve un iterable vacío y el código en el for
bucle nunca se ejecuta). no funciona en generadoressolo secuencias (tuple
, list
, str
etc).
-
Esto no funciona. Cada una de las listas separadas que está iterando no “salta” lo suficiente el siguiente registro, por lo que su ejemplo da un resultado como:[5, 7] [7, 11] [11, 4] [4, 5]
– brad
5 de marzo de 2014 a las 15:03
-
Pero ese es exactamente el resultado que queremos, ¿no?
– hluk
6 de marzo de 2014 a las 6:46
-
Hmm … sí, creo que el OP lo estaba buscando, aunque vi que la iteración “por pares” regresaba como [5,7], [11,4], [5,None]
– brad
06/03/2014 a las 19:29
-
@Brad Para este caso,
zip(a[::2], a[1::2])
que irá paso a paso de 2 en cada lista.–Evgeni Sergeev
19 de marzo de 2015 a las 6:09
jochen ritzel
Desde el itertools
recetas:
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
for v, w in pairwise(a):
...
-
@joaquin: La diferencia es que funciona en iteradores, no solo en secuencias. Eso no es necesario aquí, pero difícilmente se puede llamar a eso una exageración. Simplemente prefiero los iteradores porque trabajo con ellos todo el tiempo.
– Jochen Ritzel
23 de abril de 2011 a las 20:32
-
Para cualquier persona interesada en pares circulares de, por ejemplo, una lista
a
solo haz:pairwise(a +[a[0] ] )
.– 0 _
11 de diciembre de 2013 a las 23:57
-
Tenga en cuenta para aquellos que encuentren esto, la ventaja de que esto funciona en iteradores es que esto no requiere acceso aleatorio a un flujo de datos (es decir, acceso a la matriz); más bien, solo necesita ingerir cada elemento una vez y almacenarlo en caché para la siguiente evaluación. Entonces, si tiene, digamos, una manguera contra incendios de Twitter, nunca necesita leer la manguera contra incendios en una matriz gigantesca (quizás de longitud infinita) para que esto funcione.
– ciudad b
16 de enero de 2014 a las 22:13
-
Esta solución no elimina el último elemento si la cardinalidad iterable es VS zip impar.
– usuario305883
4 oct 2016 a las 18:26
-
En Python 3.10, puede usar
itertools.pairwise
: docs.python.org/3/library/itertools.html#itertools.pairwise– nimble_ninja
20 de marzo de 2022 a las 21:23
Santiago Alejandro
Para hacer eso debes hacer:
a = [5, 7, 11, 4, 5]
for i in range(len(a)-1):
print [a[i], a[i+1]]
-
Hacer referencia a un elemento de la lista por índice es una especie de antipatrón en Python (excepto cuando se debe acceder a los elementos fuera de secuencia). Ver github.com/JeffPaine/…
– Ian Goldby
13 de enero de 2020 a las 13:16
Gabe
Casi textualmente de Iterar sobre pares en una lista (forma circular) en Python:
def pairs(seq):
i = iter(seq)
prev = next(i)
for item in i:
yield prev, item
prev = item
>>> a = [5, 7, 11, 4, 5]
>>> for n,k in enumerate(a[:-1]):
... print a[n],a[n+1]
...
5 7
7 11
11 4
4 5
-
por qué
enumerate
si no vas a usark
?– endolito
31 de marzo de 2016 a las 3:20
-
Supongo que porque necesitamos el archivo index.
– Tanino
18 de octubre de 2016 a las 1:38
-
@Tanin Entonces no lo haría
for n i range(len(a)):
ser más preciso e idiomático?– Daniel Standage
30 de diciembre de 2016 a las 22:57
-
Sí, range(len(a) – 1) es mejor.
– Tanino
31 de diciembre de 2016 a las 6:09
-
por qué
enumerate
si no vas a usark
?– endolito
31 de marzo de 2016 a las 3:20
-
Supongo que porque necesitamos el archivo index.
– Tanino
18 de octubre de 2016 a las 1:38
-
@Tanin Entonces no lo haría
for n i range(len(a)):
ser más preciso e idiomático?– Daniel Standage
30 de diciembre de 2016 a las 22:57
-
Sí, range(len(a) – 1) es mejor.
– Tanino
31 de diciembre de 2016 a las 6:09