312 votes

Itération sur tous les deux éléments dans une liste

Comment faire une boucle for ou une compréhension de liste afin que chaque itération me donne deux éléments ?

Sortie :

Merci.

337voto

Johnsyweb Points 45395

Vous avez besoin d'un pairwise() (ou grouped()) mise en œuvre:

from itertools import izip

def pairwise(iterable):
    "s -> (s0,s1), (s2,s3), (s4, s5), ..."
    a = iter(iterable)
    return izip(a, a)

for x, y in pairwise(l):
   print "%d + %d = %d" % (x, y, x + y)

Ou, de façon plus générale:

from itertools import izip

def grouped(iterable, n):
    "s -> (s0,s1,s2,...sn-1), (sn,sn+1,sn+2,...s2n-1), (s2n,s2n+1,s2n+2,...s3n-1), ..."
    return izip(*[iter(iterable)]*n)

for x, y in grouped(l, 2):
   print "%d + %d = %d" % (x, y, x + y)

En Python 3+, vous pouvez simplement utiliser l' zip() fonction intégrée.

Tout le crédit à martineau pour sa réponse à ma question, j'ai trouvé ceci pour être très efficace, car il ne réitère une fois de plus de la liste et de ne pas créer des listes inutiles dans le processus.

N. B: Ce ne doit pas être confondue avec l' pairwise recette en Python propre itertools de la documentation, ce qui donne "s -> (s0,s1), (s1,s2), (s2, s3), ...", comme l'a souligné @lazyr dans les commentaires.

279voto

Margus Points 6175

Eh bien vous devez tuple de 2 éléments, donc

Où :

  • créent des moyens collection sous-ensemble d’éléments qui
  • ``crée une collection de tuples de x et y collections mêmes éléments de l’index.

101voto

pyanon Points 221
>>> l = [1,2,3,4,5,6]

>>> zip(l,l[1:])
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

>>> zip(l,l[1:])[::2]
[(1, 2), (3, 4), (5, 6)]

>>> [a+b for a,b in zip(l,l[1:])[::2]]
[3, 7, 11]

>>> ["%d + %d = %d" % (a,b,a+b) for a,b in zip(l,l[1:])[::2]]
['1 + 2 = 3', '3 + 4 = 7', '5 + 6 = 11']

78voto

taskinoor Points 24438

Une solution simple.

 l = [1, 2, 3, 4, 5, 6] pour i dans l’intervalle (0, len(l), 2) : impression str(l[i]), « + », str (l [i + 1]), « = », str (l [i] + l [i + 1]) 

11voto

alexpinho98 Points 333
for (i, k) in zip(l[::2], l[1::2]):
    print i, "+", k, "=", i+k

zip(*iterable) renvoie un tuple avec l'élément suivant de chaque objet iterable.

l[::2] retourne le 1er, le 3ème, le 5ème, etc. élément de la liste: le premier colon indique que la tranche commence au début car il n'y a pas de numéro derrière elle, la deuxième du côlon est nécessaire uniquement si vous souhaitez une " étape dans la tranche (dans ce cas 2).

l[1::2] fait la même chose mais dans le deuxième élément de la liste afin qu'il renvoie les 2ème, 4ème, 6ème, etc. élément de l' original de la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X