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!