Itérer sur toutes les paires d'éléments consécutifs dans une liste
Donné une liste
l = [1, 7, 3, 5]
Je veux effectuer une itération sur toutes les paires consécutives éléments de la liste de (1,7), (7,3), (3,5)
, c'est à dire
for i in xrange(len(l) - 1):
x = l[i]
y = l[i + 1]
# do something
Je voudrais le faire de façon plus compacte, comme
for x, y in someiterator(l): ...
Est-il un moyen de faire cela à l'aide de Python itérateurs? Je suis sûr que le itertools
module doit avoir une solution, mais je ne peux pas le comprendre.
- Bien que je acceppted sberry réponse, comme je l'ai demandé un simple builtin à base de solution, pensez également à l'élégante et la plus performante des solutions par thefourtheye et HansZauber.
InformationsquelleAutor flonk | 2014-01-23
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser zip
Comme suggéré que vous pourriez envisager d'utiliser la
izip
fonction dansitertools
pour de très longues listes où vous ne voulez pas créer une nouvelle liste.zip()
retourne une nouvelle liste. Mieux utiliseritertools.izip()
.zip()
retourne un itérateur. Mieux utiliser Python 3.zip(l[:-1], l[1:])
au lieuzip(l, l[1:])
?l
(la quasi-totalité de ses éléments) sans raison.Regarder
pairwise
à itertools recettes: http://docs.python.org/2/library/itertools.html#recipesCitant à partir de là:
Une Version Générale
Une version générale, que les rendements des n-uplets d'un naturel positif de la taille, peut ressembler à ça:
zip
au lieu deizip
.Je voudrais créer un générique
grouper
générateur, à l'instar de ceExemple 1
Sortie
Exemple 1
Sortie
Vous pouvez utiliser un
zip
.Comme une fermeture éclair, il crée des paires. Donc, pour mélanger vos deux listes, vous obtenez:
Puis en itérant va comme
izip_longest
, mais alors, pourquoi voudriez-vous faire cela.Généraliser sberry l'approche de la nwise avec la compréhension: l'
Par exemple
Si vous voulais quelque chose de inline mais pas très lisible voici une autre solution qui rend l'utilisation de générateurs. Je m'attends c'est pas la meilleure performance sage :-/
Convertir liste dans le générateur avec un réglage fin avant le dernier élément:
Convertir en paires:
C'est tout ce dont vous avez besoin.
l = [1, 2, 3, 4]
ce produit[(1, 2), (3, 4)]
et pas[(1, 2), (2, 3), (3, 4)]
comme demandé. Il également ne fonctionne que lorsque la liste contient un nombre pair d'éléments.