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
Libérer: 2024-12-16 21:23:11
original
805 Les gens l'ont consulté

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
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal