Ich habe die folgende Python-Liste (kann auch ein Tupel sein):
myList = ['foo', 'bar', 'baz', 'quux']
ich kann sagen
>>> myList[0:3]
['foo', 'bar', 'baz']
>>> myList[::2]
['foo', 'baz']
>>> myList[1::2]
['bar', 'quux']
Wie wähle ich explizit Elemente aus, deren Indizes keine bestimmten Muster aufweisen? Zum Beispiel möchte ich auswählen [0,2,3]
. Oder ich möchte aus einer sehr großen Liste von 1000 Artikeln auswählen [87, 342, 217, 998, 500]
. Gibt es eine Python-Syntax, die das macht? So etwas sieht aus:
>>> myBigList[87, 342, 217, 998, 500]
Antworten:
Ich habe die Antworten mit Python 2.5.2 verglichen:
19.7 usec:
[ myBigList[i] for i in [87, 342, 217, 998, 500] ]
20.6 usec:
map(myBigList.__getitem__, (87, 342, 217, 998, 500))
22,7 usec:
itemgetter(87, 342, 217, 998, 500)(myBigList)
24.6 usec:
list( myBigList[i] for i in [87, 342, 217, 998, 500] )
Beachten Sie, dass in Python 3 die erste geändert wurde, um mit der vierten identisch zu sein.
Eine andere Möglichkeit wäre, mit einer zu beginnen,
numpy.array
die die Indizierung über eine Liste oder eine ermöglichtnumpy.array
:Das
tuple
funktioniert nicht so wie das sind Slices.quelle
[myBigList[i] for i in [87, 342, 217, 998, 500]]
Am liebsten als Listenkomposition, aber ich mag diesen Ansatz am besten.from operator import itemgetter
im Initialisierungsteil von verwendet wirdpython -mtimeit
.myBigList[(87, 342, 217, 998, 500)]
funktioniert es nicht, wennmyBigList
es sich um eine normale Python handeltlist
? Wenn ich das versuche, bekomme ichTypeError: list indices must be integers or slices, not tuple
. Das wäre so viel einfacher als das Verständnis abzutippen - gibt es ein Problem mit dem Sprachdesign / der Sprachimplementierung?lists
in Python nur Ganzzahlen oder Slices akzeptiert werden. Durch Übergeben einer Ganzzahl wird sichergestellt, dass nur ein Element aus einer vorhandenen Liste abgerufen wird. Durch das Übergeben eines Slice wird sichergestellt, dass ein Teil davon abgerufen wird. Das Übergeben eines Tupels entspricht jedoch dem Übergeben eines Datentyps (tuple
) als Argument an einen anderen Datentyp (list
), der syntaktisch falsch ist.Was ist damit:
quelle
operator
Modul!Es ist nicht integriert, aber Sie können eine Unterklasse von Listen erstellen, die Tupel als "Indizes" verwendet, wenn Sie möchten:
Drucken
quelle
Vielleicht ist ein Listenverständnis angebracht:
Produziert:
Ist es das, wonach du suchst?
quelle
Sie können auch eine eigene
List
Klasse erstellen , die Tupel als Argumente unterstützt,__getitem__
wenn Sie dies möchtenmyList[(2,2,1,3)]
.quelle
operator
.len(myList)
über zu verwendenmyList.__len__()
.Ich möchte nur darauf hinweisen, dass selbst die Syntax von itemgetter wirklich ordentlich aussieht, aber es ist etwas langsam, wenn es auf einer großen Liste ausgeführt wird.
Itemgetter nahm 1.065209062149279
Mehrere Scheiben nahmen 0,6225321444745759
quelle
myList = np.array(range(1000000))
sonst erhalten Sie eine Fehlermeldung.Eine andere mögliche Lösung:
quelle
wie oft, wenn Sie ein boolesches numpy-Array wie haben
mask
[mylist[i] for i in np.arange(len(mask), dtype=int)[mask]]
Ein Lambda, das für jede Sequenz oder jedes np.array funktioniert:
subseq = lambda myseq, mask : [myseq[i] for i in np.arange(len(mask), dtype=int)[mask]]
newseq = subseq(myseq, mask)
quelle