Itérer sur des paires de valeurs qui se chevauchent en Python
Itérer sur une liste en Python tout en considérant à la fois les éléments « actuel » et « suivant » est un besoin commun. Traditionnellement, cela a été réalisé en utilisant un code tel que :
for current, next in zip(the_list, the_list[1:]): # Do something
Bien qu'efficace, cette approche n'est pas la plus idiomatique ou la plus efficiente. Une solution plus pythonique consiste à utiliser la fonction par paire du module itertools :
import itertools def pairwise(iterable): "s -> (s0, s1), (s1, s2), (s2, s3), ..." a, b = itertools.tee(iterable) next(b, None) return zip(a, b)
La fonction par paire crée deux itérateurs parallèles, a et b, pointant tous deux vers le premier élément de l'itérable d'origine. Il avance ensuite b d'un pas, ce qui fait que a pointe vers s0 et b pointe vers s1. La fonction zip associe ensuite les éléments de a et b, vous donnant des paires qui se chevauchent.
Pour Python 2, vous pouvez utiliser itertools.izip au lieu de zip pour obtenir un itérateur paresseux :
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)
Cette technique peut être étendue pour produire des « fenêtres » plus grandes en utilisant le paramètre n de la fonction tee. Par exemple, pour produire des triples, vous pouvez utiliser :
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)
Notez que l'utilisation de tee peut consommer de la mémoire si l'un des itérateurs avance plus loin que les autres. Cependant, dans les cas où les itérateurs avancent au même rythme, cette approche est efficace en mémoire et idiomatique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!