Python-Liste von Tupeln, die Liste von int
So, ich habe x=[(12,), (1,), (3,)]
(Liste von Tupeln), und ich will x=[12, 1, 3]
(Liste von Integer-zahlen) in der besten Art und Weise möglich? Können Sie bitte helfen?
- Bitte Bearbeiten Sie die Frage, auch Ihr Versuch einer Lösung. Danke.
- sind Ihre Tupel immer die gleiche form haben?
(n,)
? - Eine alternative
zip(*x)[0]
odernext(zip(*x))
auf Py3k - Mögliche Duplikate von python - abrufen der Liste von Tupeln der erste index?
InformationsquelleAutor NullException | 2013-02-26
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen nicht sagen, was du meinst mit den "besten", aber vermutlich meinst du "die meisten pythonic" oder "die meisten lesbar" oder so ähnlich.
Die Liste Verständnis gegeben durch F3AR3DLEGEND ist wohl das einfachste. Wer weiß, wie zu Lesen eine Liste Verständnis wird sofort wissen, was es bedeutet.
Jedoch oft die Sie nicht wirklich brauchen eine Liste, nur etwas, das Durchlaufen werden können, wenn. Wenn Sie haben eine Milliarden-Elemente in
x
, den Aufbau eines Milliarden-elementy
nur zum Durchlaufen Sie ein element zu einem Zeitpunkt kann eine schlechte Idee. So können Sie einen generator-Ausdruck:Wenn Sie bevorzugen funktionale Programmierung, Sie könnten es vorziehen, zu verwenden
map
. Der Nachteilmap
ist, dass Sie haben, um es zu übergeben, eine Funktion, die nicht nur einen Ausdruck, das heißt, Sie müssen entweder verwenden Sie einlambda
Funktion, oderitemgetter
:In Python 3 ist dies äquivalent zu der generator-Ausdruck; wenn Sie möchten, eine
list
werden, übergeben Sie es zurlist
. In Python 2 gibt es einelist
; wenn Sie wollen einen iterator verwendenitertools.imap
stattmap
.Wenn Sie möchten, eine mehr generische Abflachung Lösung, können Sie selbst einen schreiben, aber es ist immer einen Blick Wert
itertools
für generische Lösungen dieser Art, und es ist in der Tat ein Rezept namensflatten
zum "Glätten eine Ebene der Verschachtelung". Also, kopieren und einfügen in Ihren code (oderpip install more-itertools
) und Sie können genau dies tun:Wenn man sieht, wie
flatten
implementiert ist, und dann, wiechain.from_iterable
implementiert ist, und dann, wiechain
implementiert ist, werden Sie feststellen, dass Sie schreiben, könnte die gleiche Sache in Bezug auf die gelieferten. Aber warum die Mühe, wennflatten
wird besser lesbar und offensichtlich?Schließlich, wenn Sie möchten, reduzieren die generische version um eine verschachtelte Liste das Verständnis (oder einen generator-Ausdruck, natürlich):
Jedoch verschachtelte Liste Verstehens sind sehr leicht zu bekommen, falsch, sowohl im schreiben und Lesen. (Beachten Sie, dass F3AR3DLEGEND, von der gleichen person, wer hat die einfachste Antwort zuerst, gab auch eine verschachtelte Verständnis und hat es falsch verstanden. Wenn er nicht abziehen, sind Sie sicher, dass Sie möchten, es zu versuchen?) Für wirklich einfache Fälle, Sie sind nicht allzu schlecht, aber trotzdem, ich denke
flatten
ist viel einfacher zu Lesen.Funktioniert dies nur für ein element pro Tupel, aber.
Jedoch, wenn Sie mehrere Elemente pro Tupel, die Sie verwenden können, eine etwas komplexere Liste Verständnis:
Referenz: Liste Verstehens
itertools
docs genanntflatten
. Lohnt es sich wahrscheinlich, Verständnis, dass und die Liste Verständnis.for
s?range(len(i))
nur um die Werte, die durch den index?i[j] for j in range(len(i))
ist genau das gleiche wiej for j in i
.Nur dazu:
Erklärung:
Dies ist der effizienteste Weg:
oder, was dasselbe ist
Dies ist ein bisschen langsamer:
list
im 3.3.0, Sie nahm 4.15 ms und 4.14 ms jeweils—und es sieht aus wie mehr als 4ms, war die Zeit Durchlaufen der Liste und den Bau einer neuen Liste, so dass nichts ist wahrscheinlich schneller. Wenn Sie ändern Sie x, um eine genexp und ersetzen Sie die zwei listcomps mit einem genexp zugeführtdeque(genexp, maxlen=0)
bekomme ich bei 1,36 us vs. 1.32 uns.können Sie mit map-Funktion....
map
, Sie könnte genauso gut verwendenitemgetter
statt einerlambda
.