Maison >développement back-end >Tutoriel Python >Comment puis-je itérer efficacement sur des paires (ou triples) d'éléments qui se chevauchent dans une liste Python ?

Comment puis-je itérer efficacement sur des paires (ou triples) d'éléments qui se chevauchent dans une liste Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-16 14:53:17492parcourir

How Can I Efficiently Iterate Over Overlapping Pairs (or Triples) of Elements in a Python List?

Itération sur des paires de valeurs qui se chevauchent en Python

Lorsque vous parcourez une liste en Python, vous devrez peut-être accéder à la fois à l'élément actuel et à l'élément actuel. élément suivant simultanément. Traditionnellement, cela a été accompli en utilisant du code tel que :

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

Cependant, Python 3.8 a introduit un moyen plus efficace d'y parvenir :

Utilisation de la fonction par paire

La documentation Python fournit une simple fonction par paire à cet effet :

import itertools

def pairwise(iterable):
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

Cette fonction crée deux itérateurs, a et b, qui pointent vers le premier élément de l’itérable d’entrée. L'itérateur b est ensuite avancé d'un pas, ce qui fait que a pointe vers l'élément actuel et b pointe vers l'élément suivant. La fonction zip est ensuite utilisée pour créer des paires de ces éléments.

Pour Python 2

Pour Python 2, vous pouvez utiliser une fonction par paire similaire avec itertools.izip fonction au lieu de zip :

import itertools

def pairwise(iterable):
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

Généraliser à plusieurs Éléments

La fonction par paire peut être généralisée pour produire de plus grandes fenêtres d'éléments en ajustant le paramètre n dans l'appel tee. Par exemple, pour créer des paires de trois éléments, vous pouvez utiliser :

def threes(iterator):
    a, b, c = itertools.tee(iterator, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b, c)

Mise en garde

Il est important de noter que cette technique peut consommer une quantité importante de mémoire si un itérateur avance plus loin que les autres. Cela peut se produire lorsque la taille de la fenêtre est grande ou s'il y a de nombreux éléments dans l'itérable d'origine.

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