Transform "- Liste von Tupeln" in einer flachen Liste oder einer matrix
Mit Sqlite, ein "select..from" - Befehl gibt die Ergebnisse "output", das Drucke (in python):
>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
Scheint es sich um eine Liste von Tupeln. Ich möchte entweder konvertieren "output" in einem einfachen 1D-array (=Liste, in Python, die ich denke):
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
oder einer 2x3 matrix:
12.2817 12.2817
0 0
8.52 8.52
gelesen werden, die über "output[i][j]"
Den flatten-Befehl nicht die Arbeit machen, für die 1. option, und ich habe keine Idee für die zweite... 🙂
Bitte könnten Sie mir einen Tipp geben? Einige Sache schnell groß sein würde, wie real die Daten sind viel größer (hier ist nur ein einfaches Beispiel).
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
ist schon eine 3x2-matrix !? oder habe ich da etwas verpasst ?- Siehe diese Frage
- für die flatten-Funktion überprüfen itertools-Modul-Rezepte gibt es bereits eine Funktion "reduzieren" Beispiel: docs.python.org/library/itertools.html#recipes
[item for sublist in output for item in sublist]
funktioniert einwandfrei und hat den Vorteil, dass Ihre innere Tupel könnte auch Listen; generell jede Kombination von inneren und äußeren wiederholenden arbeiten
InformationsquelleAutor garth | 2012-05-17
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das mit Abstand Schnellste (und kürzeste) Lösung gepostet:
Etwa 50% schneller als die
itertools
- Lösung, und etwa 70% schneller als diemap
Lösung.list(output[0]+output[1]+output[2])
gibt das gewünschte Ergebnis, aberlist(sum(output))
nicht. Warum? Welche "Magie" muss die () zu tun?sum(sequence[, start])
: Summe addiertstart
standardmäßig0
sondern dann nur absequence[0]
wenn es vorhanden ist und fügt dann den rest der Elemente. Sorry für stört Sie.sum
zu Sequenzen verketten, es Ergebnisse in einer quadratischen Zeit-Algorithmus. In der Tat, diesum
Funktion wird sich beschweren, falls Sie versuchen, diese mit Saiten!Liste Verständnis Konzept, das funktioniert mit Wiederholenden Typen und ist schneller als andere Methoden, die hier gezeigt werden.
l
ist die Liste zu reduzieren (genanntoutput
im OP der Fall)timeit tests:
Liste Verständnis
timeit Ergebnis = 7.67 µs ± 129 ns pro Schleife
Liste erweitern () - Methode
timeit Ergebnis = 11 µs ± 433 ns pro Schleife
Summe()
timeit Ergebnis = 24.2 µs ± 269 ns pro Schleife
In Python 3 können Sie den
*
syntax zu glätten, eine Liste von iterables:Oder Sie können glätten die Liste wie diese:
reduce(lambda x,y:x+y, output)
scheint zu funktionieren, die direkt konvertieren in eine lange Tupel (die umgewandelt werden können, um eine Liste). Warummap(list, output)
innerhalb derreduce()
nennen? Vielleicht ist Es mehr in Einklang mit der Tatsache, dass Tupel sind unveränderliche Listen sind veränderlich.verwenden
itertools
Kette:könnten Sie leicht verschieben Sie aus der Liste von Tupel auf einzelne Liste, wie oben gezeigt.
Update: Abflachung mit verlängern, aber ohne das Verständnis und ohne die Verwendung der Liste als iterator (Schnellste)
Nach Prüfung der nächsten Antwort auf diese, dass, sofern eine schnellere Lösung durch eine list comprehension mit
dual for
ich habe ein wenig zwicken und jetzt führt es besser, zuerst die Ausführung der Liste(...) war, ziehen einen großen Prozentsatz der Zeit, dann ändern einer Liste Verständnis für eine einfache Schleife Rasiert ein bisschen mehr als gut.Ist die neue Lösung:
Älter:
Abflachung mit Karte/erweitern:
Abflachung mit list comprehension statt Karte
einige timeits für neue verlängern und die Verbesserung bekommen, indem nur Liste(...) für [...]:
Dies ist, was
numpy
für gemacht wurde, die beide aus einem data-Strukturen, sowie die Geschwindigkeit Perspektive.Im Fall der willkürlichen verschachtelte Listen(nur für den Fall):