Maison > développement back-end > Tutoriel Python > Comment puis-je itérer efficacement sur des paires qui se chevauchent (ou des fenêtres à N éléments) de valeurs de liste en Python ?

Comment puis-je itérer efficacement sur des paires qui se chevauchent (ou des fenêtres à N éléments) de valeurs de liste en Python ?

Mary-Kate Olsen
Libérer: 2024-12-22 17:48:15
original
384 Les gens l'ont consulté

How Can I Efficiently Iterate Over Overlapping Pairs (or N-element Windows) of List Values in Python?

Itération sur des paires de valeurs de liste qui se chevauchent

Lors d'une itération sur une liste Python, il est souvent nécessaire d'accéder à la fois aux éléments actuels et suivants. Bien que l'utilisation de la fonction zip pour associer des valeurs consécutives soit efficace, il peut exister une approche plus efficace.

Utilisation de la fonction pairwise()

Python 3.8 fournit les itertools. Fonction pairwise(), qui associe les éléments successifs d'un itérable :

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

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

Exemple d'utilisation :

the_list = ['a', 'b', 'c', 'd']

for current, next in pairwise(the_list):
    print(current, next)

# Output:
# a b
# b c
# c d
Copier après la connexion

Mises en garde :

Il est crucial de noter que pairwise() fonctionne en itérant plusieurs fois sur l'itérable. Cela signifie que si un itérateur avance beaucoup plus rapidement que les autres, l'implémentation peut conserver les éléments consommés en mémoire pour garantir qu'ils sont disponibles pour tous les itérateurs.

Autres options pour les fenêtres à N éléments

La fonction pairwise() peut être étendue pour créer des fenêtres de tailles arbitraires :

def n_wise(iterable, n):
    "s -> (s0, s1, ..., s(n-1)), (s1, s2, ..., s(n)), ..."
    iterators = itertools.tee(iterable, n)
    for i in range(1, n):
        next(iterators[i], None)
    return zip(*iterators)
Copier après la connexion

Par exemple, pour parcourir des triples dans une liste :

for triplet in n_wise(the_list, 3):
    print(*triplet)

# Output:
# a b c
# b c d
Copier après la connexion

Conclusion :

Bien que la méthode traditionnelle d'itération sur des paires qui se chevauchent à l'aide de zip soit viable, les fonctions pairwise() et n_wise offrent un aperçu concis et efficace pour obtenir le même résultat pour des fenêtres de toutes tailles.

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