Mam następującą listę w Pythonie (może to być również krotka):
myList = ['foo', 'bar', 'baz', 'quux']
mogę powiedzieć
>>> myList[0:3]
['foo', 'bar', 'baz']
>>> myList[::2]
['foo', 'baz']
>>> myList[1::2]
['bar', 'quux']
Jak jawnie wybrać towary, których indeksy nie mają określonych wzorców? Na przykład chcę wybrać [0,2,3]
. Lub z bardzo dużej listy 1000 pozycji, które chcę wybrać [87, 342, 217, 998, 500]
. Czy jest jakaś składnia Pythona, która to robi? Coś, co wygląda jak:
>>> myBigList[87, 342, 217, 998, 500]
Odpowiedzi:
Porównałem odpowiedzi z Pythonem 2.5.2:
19,7 usek:
[ myBigList[i] for i in [87, 342, 217, 998, 500] ]
20,6 usek:
map(myBigList.__getitem__, (87, 342, 217, 998, 500))
22,7 usek:
itemgetter(87, 342, 217, 998, 500)(myBigList)
24,6 usek:
list( myBigList[i] for i in [87, 342, 217, 998, 500] )
Zwróć uwagę, że w Pythonie 3 pierwszy został zmieniony na taki sam jak czwarty.
Inną opcją byłoby rozpoczęcie od a,
numpy.array
który umożliwia indeksowanie za pomocą listy lubnumpy.array
:tuple
Nie działa w ten sam sposób jak te są plastry.źródło
[myBigList[i] for i in [87, 342, 217, 998, 500]]
, ale to podejście podoba mi się najbardziej.from operator import itemgetter
w części inicjalizacyjnejpython -mtimeit
.myBigList[(87, 342, 217, 998, 500)]
nie działa, gdymyBigList
jest zwykłym Pythonemlist
? Kiedy próbuję, dostajęTypeError: list indices must be integers or slices, not tuple
. Byłoby to o wiele łatwiejsze niż wpisanie zrozumienia - czy jest jakiś problem z projektem / implementacją języka?lists
w Pythonie akceptujemy tylko liczby całkowite lub wycinki. Przekazanie liczby całkowitej zapewnia, że z istniejącej listy zostanie pobrany tylko jeden element. Przekazanie wycinka zapewnia pobranie jego części, ale przekazanie krotki jest podobne do przekazania danych typu (tuple
) jako argumentu do innego typu danych (list
), co jest niepoprawne składniowo.A co z tym:
źródło
operator
moduł!Nie jest wbudowana, ale jeśli chcesz, możesz utworzyć podklasę listy, która pobiera krotki jako „indeksy”:
druk
źródło
Może warto posłuchać listy:
Produkuje:
Czy tego szukasz?
źródło
Możesz także stworzyć własną
List
klasę, która obsługuje krotki jako argumenty,__getitem__
jeśli chcesz mieć taką możliwośćmyList[(2,2,1,3)]
.źródło
operator
.len(myList)
overmyList.__len__()
.Chcę tylko podkreślić, że nawet składnia itemgetter wygląda naprawdę schludnie, ale działa trochę wolno, gdy wykonuje się na dużej liście.
Itemgetter zajął 1.065209062149279
Wiele wycinków zajęło 0,6225321444745759
źródło
myList = np.array(range(1000000))
przeciwnym razie pojawi się błąd.Inne możliwe rozwiązanie:
źródło
jak często, gdy masz tablicę logiczną numpy, taką jak
mask
[mylist[i] for i in np.arange(len(mask), dtype=int)[mask]]
Lambda, która działa dla dowolnej sekwencji lub np. Tablicy:
subseq = lambda myseq, mask : [myseq[i] for i in np.arange(len(mask), dtype=int)[mask]]
newseq = subseq(myseq, mask)
źródło