Ich muss einige Elemente aus der angegebenen Liste auswählen und deren Index kennen. Angenommen, ich möchte aus der angegebenen Liste eine neue Liste erstellen, die ein Element mit dem Index 1, 2, 5 enthält [-2, 1, 5, 3, 8, 5, 6]. Was ich getan habe ist:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
Gibt es einen besseren Weg, dies zu tun? so etwas wie c = a [b]?
lambda
Funktion eingeschlossen.Antworten:
Sie können verwenden
operator.itemgetter
:Oder Sie können numpy verwenden :
Aber wirklich, Ihre aktuelle Lösung ist in Ordnung. Es ist wahrscheinlich das ordentlichste von allen.
quelle
c = [a[i] for i in b]
das vollkommen in Ordnung ist. Beachten Sie, dass dieitemgetter
Lösung nicht dasselbe tut, wenn b weniger als 2 Elemente enthält.a[b]
funktioniert nur, wenna
es sich um ein Numpy- Array handelt, dh wenn Sie es mit einer Numpy-Funktion erstellen.Alternativen:
quelle
build-in
Funktionen verwenden__getitem__
es nicht kompatibel zu sein scheint, z. B. wie man den Typ des Elements abbildet.map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
. In diesem Fall ist die Verwendung[..]
kompakter:lambda x: type(a[x]), b
Eine andere Lösung könnte über die Pandas-Serie sein:
Sie können c dann wieder in eine Liste konvertieren, wenn Sie möchten:
quelle
Grundlegende und nicht sehr umfangreiche Tests zum Vergleich der Ausführungszeit der fünf gelieferten Antworten:
mit der folgenden Eingabe:
Die einfache Python-Schleife war die schnellste mit der Lambda-Operation, eine knappe Sekunde, mapIndexValues und getIndexValues waren sich mit der numpy-Methode nach der Konvertierung von Listen in numpy-Arrays durchweg ziemlich ähnlich. Wenn sich Daten bereits in numpy-Arrays befinden, ist die numpyIndexValues-Methode mit der entfernten numpy.array-Konvertierung am schnellsten.
quelle
numpyIndexValues
nicht funktioniert , daa
,b
vom Typ istrange
. Ich vermute , dass Sie konvertieren menta
,b
umnumpy.ndarrays
zuerst?Ich bin sicher, dass dies bereits berücksichtigt wurde: Wenn die Anzahl der Indizes in b klein und konstant ist, könnte man das Ergebnis einfach wie folgt schreiben:
Oder noch einfacher, wenn die Indizes selbst Konstanten sind ...
Oder wenn es einen aufeinanderfolgenden Bereich von Indizes gibt ...
quelle
[a] + [b] = [a, b]
Hier ist ein einfacher Weg:
quelle
Meine Antwort verwendet keine Numpy- oder Python-Sammlungen.
Ein trivialer Weg, um Elemente zu finden, wäre wie folgt:
Nachteil: Diese Methode funktioniert möglicherweise nicht für größere Listen. Die Verwendung von numpy wird für größere Listen empfohlen.
quelle
a
.[a[i] for i in b]
a
noch 5 drin wären ?[a[i] if i<len(a) else None for i in b]
Statische Indizes und kleine Liste?
Vergessen Sie nicht, dass, wenn die Liste klein ist und sich die Indizes nicht ändern, wie in Ihrem Beispiel, manchmal das Entpacken von Sequenzen am besten ist :
Die Leistung ist viel besser und Sie können auch eine Codezeile speichern:
quelle
Art von pythonischer Art:
quelle
O(n)
Lösung in eineO(n^2)
Lösung umzuwandeln und gleichzeitig die Länge des Codes fast zu verdoppeln. Sie sollten auch beachten, dass der Ansatz fehlschlägt, wenn die Liste Objekte enthält, die unscharf oder teilweise gleich sind, z. B. wenn siea
enthältfloat('nan')
, wird immer a ausgelöstValueError
.