Maison >développement back-end >Tutoriel Python >Comment aplatir efficacement des listes irrégulièrement imbriquées en Python ?

Comment aplatir efficacement des listes irrégulièrement imbriquées en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-30 18:38:20620parcourir

How to Efficiently Flatten Irregularly Nested Lists in Python?

Comment aplatir une liste de listes imbriquées irrégulières

Bien qu'il y ait des discussions autour de l'aplatissement des structures de liste, les solutions ont tendance à échouer lorsque les listes sont profondément imbriqué. Une approche efficace est présentée ci-dessous :

Approche de fonction récursive

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

Cette fonction vérifie si chaque élément est itérable (sauf pour les chaînes) et l'aplatit de manière récursive si vrai . Des éléments non itérables sont ajoutés au résultat.

Approche de la fonction génératrice

L'amélioration de la lisibilité et des performances du processus d'aplatissement est possible à l'aide des fonctions génératrices :

Python 2 (utilisant Iterable ABC):

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 (en utilisant un tuple pour str et bytes) :

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

Cette fonction génératrice renvoie paresseusement les éléments aplatis, optimisant ainsi l'utilisation de la mémoire . Il peut être itéré ou converti en liste selon les besoins.

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