Wie kann man aus einer Liste von Listen eine flache Liste machen?
Ich frage mich, ob es eine Abkürzung gibt, um eine einfache Liste aus einer Liste von Listen in Python zu erstellen.
Ich kann das in einer "for"-Schleife machen, aber vielleicht gibt es einen coolen "Einzeiler"? Ich habe es mit reduce()
versucht, aber ich bekomme einen Fehler.
Code
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
Fehlermeldung
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
2901
3
Gegeben eine Liste von Listen
l
,flat_list = [item for sublist in l for item in sublist]`
was bedeutet:
ist schneller als die bisher veröffentlichten Abkürzungen. (
l
ist die zu glättende Liste.)Hier ist die entsprechende Funktion:
Als Beweis können Sie das Modul
timeit
in der Standardbibliothek verwenden:Erklärung: die auf
+
basierenden Abkürzungen (einschließlich der impliziten Verwendung insum
) sind notwendigerweiseO(L**2)
, wenn es L Unterlisten gibt -- da die Zwischenergebnisliste immer länger wird, wird bei jedem Schritt ein neues Zwischenergebnislisten-Objekt zugewiesen, und alle Elemente des vorherigen Zwischenergebnisses müssen rüberkopiert werden (sowie einige neue am Ende hinzugefügt werden). Der Einfachheit halber und ohne Verlust der Allgemeingültigkeit sei angenommen, dass Sie L Unterlisten mit jeweils I Elementen haben: die ersten I Elemente werden L-1 mal hin- und herkopiert, die zweiten I Elemente L-2 mal, und so weiter; die Gesamtzahl der Kopien ist I mal die Summe von x für x von 1 bis L ausgeschlossen, d.h.I * (L**2)/2
.Das Listenverständnis erzeugt nur einmal eine Liste und kopiert jedes Element (von seinem ursprünglichen Aufenthaltsort in die Ergebnisliste) ebenfalls genau einmal.
Anmerkung des Autors: Das ist ineffizient. Aber es macht Spaß, weil monoids großartig ist. Es ist nicht geeignet für die Produktion Python-Code.
Dies summiert einfach die Elemente der im ersten Argument übergebenen iterable, wobei das zweite Argument als Anfangswert der Summe behandelt wird (wenn es nicht angegeben wird, wird stattdessen
0
verwendet und in diesem Fall wird ein Fehler ausgegeben).Da Sie verschachtelte Listen summieren, erhalten Sie tatsächlich
[1,3]+[2,4]
als Ergebnis vonsum([[1,3],[2,4]],[])
, was gleich[1,3,2,4]
ist.Beachten Sie, dass dies nur bei Listen von Listen funktioniert. Für Listen von Listen von Listen brauchen Sie eine andere Lösung.
Die Methode
extend()
in Ihrem Beispiel verändertx
, anstatt einen nützlichen Wert zurückzugeben (denreduce()
erwartet).Ein schnellerer Weg, die
reduce
Version zu machen, wäre