Maison > développement back-end > Tutoriel Python > Comment les générateurs Python peuvent-ils aplatir efficacement des listes arbitrairement imbriquées ?

Comment les générateurs Python peuvent-ils aplatir efficacement des listes arbitrairement imbriquées ?

Mary-Kate Olsen
Libérer: 2024-12-21 15:02:09
original
689 Les gens l'ont consulté

How Can Python Generators Efficiently Flatten Arbitrarily Nested Lists?

Aplatir des listes irrégulières avec des générateurs Python

Le problème de l'aplatissement d'une liste de listes arbitrairement imbriquées est courant, mais les solutions existantes échouent souvent profondément structures imbriquées. En particulier, une liste comme [[[1, 2, 3], [4, 5]], 6] ne peut pas être aplatie avec la plupart des solutions.

La fonction suivante, basée sur une solution d'une autre question, peut efficacement aplatir de telles listes :

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, bien que cette fonction fonctionne, elle peut être améliorée en termes de lisibilité et de performances à l'aide du générateur fonctions.

Python 2 avec ABC itérable

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 avec ABC itérable et Yield From

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

Ces solutions basées sur un générateur offrent un moyen plus concis et efficace d'aplatir les listes irrégulières. Ils fonctionnent en parcourant chaque élément de la liste et en produisant de manière récursive des éléments pour les sous-listes. Tous les éléments non itérables (par exemple, des nombres ou des chaînes) sont immédiatement générés.

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