Maison >développement back-end >Tutoriel Python >Comment itérer efficacement sur des paires (et des triples) qui se chevauchent dans des listes Python ?

Comment itérer efficacement sur des paires (et des triples) qui se chevauchent dans des listes Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-22 06:00:18809parcourir

How to Efficiently Iterate Over Overlapping Pairs (and Triples) in Python Lists?

Comment itérer des paires de valeurs qui se chevauchent à partir d'une liste

Lorsque vous travaillez avec des listes en Python, il est souvent nécessaire de parcourir les valeurs par paires. Une approche courante consiste à utiliser une construction telle que :

for current, next in zip(the_list, the_list[1:]):
    # Do something

Pendant que ce code fonctionne, il existe une solution plus idiomatique et plus efficace utilisant la fonction par paire du module itertools. Voici une implémentation révisée de Python 3.8 :

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, utilisez itertools.izip au lieu de zip (puisque zip dans Python 2 crée une liste au lieu d'un itérateur paresseux).

Le La fonction par paire fonctionne en créant deux itérateurs parallèles, a et b, pointant vers le même premier élément. b est ensuite avancé d'un pas en utilisant next. La fonction izip combine les éléments des deux itérateurs pour former des paires qui se chevauchent.

Cette approche peut également être généralisée pour gérer des « fenêtres » de valeurs plus grandes. Par exemple, pour parcourir des triples de valeurs, utilisez la fonction suivante :

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)

Attention : Il est important de noter que si l'un des itérateurs avance plus loin que les autres en raison de la En utilisant next, l'implémentation conservera les éléments consommés en mémoire jusqu'à ce que tous les itérateurs les aient consommés.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn