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