Voici un exemple pertinent tiré du itertools docs du module :
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
Pour Python 2, vous avez besoin de itertools.izip
au lieu de zip
:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
Comment cela fonctionne :
Tout d'abord, deux itérateurs parallèles, a
y b
sont créés (le tee()
), tous deux pointant vers le premier élément de l'itérable original. Le deuxième itérateur, b
est déplacé d'un pas en avant (le next(b, None)
) appel). À ce stade a
pointe vers s0 et b
pointe vers s1. Les deux sites a
y b
peut parcourir l'itérateur original indépendamment - la fonction izip prend les deux itérateurs et crée des paires d'éléments retournés, faisant avancer les deux itérateurs au même rythme.
Une mise en garde : le tee()
produit deux itérateurs qui peuvent avancer indépendamment l'un de l'autre, mais cela a un coût. Si l'un des itérateurs avance plus loin que l'autre, alors tee()
doit conserver les éléments consommés en mémoire jusqu'à ce que le second itérateur les consomme également (il ne peut pas "rembobiner" l'itérateur original). Ici, cela n'a pas d'importance car un itérateur n'a qu'un pas d'avance sur l'autre, mais en général, il est facile d'utiliser beaucoup de mémoire de cette façon.
Et comme tee()
peut prendre un n
ce paramètre peut également être utilisé pour plus de deux itérateurs parallèles :
def threes(iterator):
"s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
a, b, c = itertools.tee(iterator, 3)
next(b, None)
next(c, None)
next(c, None)
return zip(a, b, c)
0 votes
Consultez la réponse de MizardX pour cette question . Mais je ne pense pas que cette solution soit plus idiomatique que la vôtre.
2 votes
Jetez un coup d'œil à Construire un itérateur Python de base .
48 votes
Puisque personne d'autre ne l'a mentionné, je vais être ce type de personne et signaler que l'utilisation de la
next
cette façon de masquer un intégré.0 votes
@senderle Peut-être que c'est Python 2
3 votes
@thecoder16 :
next
est également une fonction intégrée dans Python 2.0 votes
Imho
zip(the_list, the_list[1:])
ça me semble idiomatique.