Ich habe eine Liste wie unten, in der das erste Element die ID und das andere eine Zeichenfolge ist:
[(1, u'abc'), (2, u'def')]
Ich möchte eine Liste von IDs nur aus dieser Liste von Tupeln wie folgt erstellen:
[1,2]
Ich werde diese Liste verwenden, __in
daher muss es sich um eine Liste ganzzahliger Werte handeln.
meinst du so etwas
Was Sie tatsächlich haben, ist eine Liste von
tuple
Objekten, keine Liste von Mengen (wie Ihre ursprüngliche Frage impliziert). Wenn es sich tatsächlich um eine Liste von Mengen handelt, gibt es kein erstes Element, da Mengen keine Reihenfolge haben.Hier habe ich eine flache Liste erstellt, da dies im Allgemeinen nützlicher erscheint als das Erstellen einer Liste mit 1 Element-Tupeln. Sie können jedoch leicht eine Liste von 1 Elemente Tupeln von nur Ersatz schaffen
seq[0]
mit(seq[0],)
.quelle
int() argument must be a string or a number, not 'QuerySet'
int()
ist nirgends in meiner Lösung, daher muss die Ausnahme, die Sie sehen, später im Code erscheinen.__in
zum Filtern von Daten verwenden__in
? - Basierend auf der von Ihnen angegebenen Beispieleingabe wird eine Liste von Ganzzahlen erstellt. Wenn Ihre Liste der Tupel jedoch nicht mit Ganzzahlen beginnt, erhalten Sie keine Ganzzahlen, und Sie müssen diese über Ganzzahlenint
erstellen oder versuchen, herauszufinden, warum Ihr erstes Element nicht in eine Ganzzahl konvertiert werden kann.new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]
?Sie können "Tupel entpacken" verwenden:
Zur Iterationszeit wird jedes Tupel entpackt und seine Werte werden auf die Variablen
idx
und gesetztval
.quelle
Dafür ist da
operator.itemgetter
.Die
itemgetter
Anweisung gibt eine Funktion zurück, die den Index des von Ihnen angegebenen Elements zurückgibt. Es ist genau das gleiche wie beim SchreibenAber ich finde das
itemgetter
klarer und deutlicher .Dies ist praktisch, um kompakte Sortieranweisungen zu erstellen. Beispielsweise,
quelle
Aus Sicht der Leistung in python3.X
[i[0] for i in a]
undlist(zip(*a))[0]
sind gleichwertiglist(map(operator.itemgetter(0), a))
Code
Ausgabe
3.491014136001468e-05
3.422205176000717e-05
quelle
Wenn die Tupel eindeutig sind, kann dies funktionieren
quelle
ordereddict
.als ich lief (wie oben vorgeschlagen):
anstatt zurückzukehren:
Ich erhielt dies als Rückgabe:
Ich stellte fest, dass ich list () verwenden musste:
um eine Liste mit diesem Vorschlag erfolgreich zurückzugeben. Trotzdem bin ich mit dieser Lösung zufrieden, danke. (getestet / ausgeführt mit Spyder, iPython-Konsole, Python v3.6)
quelle
Ich dachte, dass es nützlich sein könnte, die Laufzeiten der verschiedenen Ansätze zu vergleichen, also habe ich einen Benchmark erstellt (mit simple_benchmark Bibliothek).
I) Benchmark mit Tupeln mit 2 Elementen
Wie Sie vielleicht erwarten können, ist die Auswahl des ersten Elements aus Tupeln nach Index
0
die schnellste Lösung, die der Entpackungslösung sehr nahe kommt, indem genau 2 Werte erwartet werdenII) Benchmark mit Tupeln mit 2 oder mehr Elementen
quelle
Das sind Tupel, keine Mengen. Du kannst das:
quelle
Sie können Ihre Tupel auspacken und nur das erste Element mit einem Listenverständnis erhalten:
Ausgabe:
Dies funktioniert unabhängig von der Anzahl der Elemente in einem Tupel:
Ausgabe:
quelle
Ich fragte mich, warum niemand vorgeschlagen hatte, Numpy zu verwenden, aber jetzt, nachdem ich es überprüft hatte, verstehe ich. Es ist möglicherweise nicht das Beste für Arrays vom gemischten Typ.
Dies wäre eine Lösung in numpy:
quelle