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
DDDoriginal
2024-12-28 03:19:15323parcourir

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

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

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

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!

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