Maison > développement back-end > Tutoriel Python > Comment les listes irrégulièrement imbriquées peuvent-elles être aplaties efficacement en Python à l'aide d'approches récursives et basées sur un générateur ?

Comment les listes irrégulièrement imbriquées peuvent-elles être aplaties efficacement en Python à l'aide d'approches récursives et basées sur un générateur ?

DDD
Libérer: 2024-12-28 03:19:15
original
304 Les gens l'ont consulté

How Can Irregularly Nested Lists Be Efficiently Flattened in Python Using Recursive and Generator-Based Approaches?

Aplatir une liste de listes imbriquées de manière irrégulière

La tâche d'aplatir une liste de listes imbriquées peut être difficile, en particulier lorsque l'imbrication est irrégulière. La question présentée examine l'efficacité de l'algorithme d'aplatissement suivant :

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result
Copier après la connexion

Cependant, la question soulève également la possibilité d'approches alternatives utilisant des fonctions génératrices.

Aplatissement basé sur un générateur

Les fonctions basées sur un générateur peuvent simplifier le processus d'aplatissement et potentiellement améliorer les performances. Voici des exemples pour Python 2 et 3 :

Python 2

Utilisation de l'ABC itérable introduit dans Python 2.6 :

from collections import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, basestring):
            for item in flatten(x):
                yield item
        else:
            yield x
Copier après la connexion

Python 3

Dans Python 3, le type basestring n'est plus présent et le tuple (str, bytes) peut être utilisé à la place. De plus, le rendement de l'opérateur simplifie l'itération sur les générateurs :

from collections.abc import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            yield from flatten(x)
        else:
            yield x
Copier après la connexion

L'approche basée sur le générateur a l'avantage d'être plus concise et potentiellement plus efficace, car elle évite les listes intermédiaires et accumule les résultats étape par étape. .

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal