Iterar a través de pares de elementos adyacentes en una lista de Python [duplicate]

3 minutos de lectura

avatar de usuario de marvin_yorke
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]

avatar de usuario de hluk
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, stretc).

  • 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

Avatar de usuario de Jochen Ritzel
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 asolo 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

Avatar de usuario de Santiago Alessandri
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

Avatar de usuario de Gabe
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 usar k?

    – 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 usar k?

    – 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

¿Ha sido útil esta solución?