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
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
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
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!