Reduzieren einer flachen Liste in Python

| | | | | | | | | | | | | |

Gibt es eine einfache Möglichkeit, eine Liste von Iterables mit einem Listenverständnis zu glätten, oder was würdet ihr alle als die beste Möglichkeit ansehen, eine flache Liste wie diese zu glätten und dabei Leistung und Lesbarkeit in Einklang zu bringen?

Ich habe versucht, eine solche Liste mit einem verschachtelten Listenverständnis wie folgt zu vereinfachen:

[image for image in menuitem for menuitem in list_of_menuitems] 

Aber ich bekomme dort Ärger mit der Sorte NameError, weil der name "menuitem" nicht definiert ist. Nachdem ich gegoogelt und mich auf Stack Overflow umgesehen hatte, erhielt ich die gewünschten Ergebnisse mit einer reduce-Anweisung:

reduce(list.__add__, map(lambda x: list(x ), list_of_menuitems)) 

Aber diese Methode ist ziemlich unlesbar, weil ich diesen list(x)-Aufruf dort brauche, weil x ein Django-QuerySet Objekt.

Fazit:

Vielen Dank an alle, die zu dieser Frage beigetragen haben. Hier ist eine Zusammenfassung dessen, was ich gelernt habe. Ich mache dies auch zu einem Community-Wiki, falls andere diese Beobachtungen ergänzen oder korrigieren möchten.

Meine ursprüngliche Reduce-Anweisung ist überflüssig und sollte besser so geschrieben werden:

>>> Reduce(list.__add__, (list(mi) for mi in list_of_menuitems)) 

Dies ist die korrekte Syntax für ein verschachteltes Listenverständnis (Brillante Zusammenfassung dF!):

>>> [image for mi in list_of_menuitems for image in mi] 

Aber keine dieser Methoden ist so effizient wie die Verwendung von itertools.chain:

>>> ; from itertools import chain >>> list(chain(*list_of_menuitems)) 

Und wie @cdleary anmerkt, ist es wahrscheinlich besser, die Magie des *-Operators zu vermeiden, indem chain.from_iterable etwa so:

>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]]) >>> print(list(chain)) >>> [1, 2, 3, 5, 89, 6]