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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-16 21:23:11807parcourir

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

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!

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