Muszę wybrać niektóre elementy z podanej listy, znając ich indeks. Powiedzmy, że chciałbym utworzyć nową listę, która zawiera element o indeksie 1, 2, 5, z podanej listy [-2, 1, 5, 3, 8, 5, 6]. To co zrobiłem to:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
Czy jest na to lepszy sposób? coś jak c = a [b]?
lambda
funkcji.Odpowiedzi:
Możesz użyć
operator.itemgetter
:Lub możesz użyć numpy :
Ale tak naprawdę twoje obecne rozwiązanie jest w porządku. To chyba najładniejszy ze wszystkich.
źródło
c = [a[i] for i in b]
jest w porządku. Zauważ, żeitemgetter
rozwiązanie nie zrobi tego samego, jeśli b ma mniej niż 2 elementy.a[b]
działa tylko wtedy, gdya
jest tablicą numpy , tzn. Tworzysz ją za pomocą funkcji numpy.Alternatywy:
źródło
build-in
funkcji__getitem__
że wydaje się, że nie da się go zmierzyć, np. Jak zmapować typ przedmiotu?map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
. W tym przypadku użycie[..]
jest bardziej kompaktowe:lambda x: type(a[x]), b
Innym rozwiązaniem może być seria pand:
Następnie możesz przekonwertować c z powrotem na listę, jeśli chcesz:
źródło
Podstawowe i niezbyt obszerne testy porównujące czas wykonania pięciu dostarczonych odpowiedzi:
przy użyciu następującego wejścia:
prosta pętla pytona była najszybsza z operacją lambda w ułamku sekundy, mapIndexValues i getIndexValues były konsekwentnie dość podobne z metodą numpy znacznie wolniej po konwersji list na tablice numpy.Jeśli dane są już w tablicach numpy, metoda numpyIndexValues z usuniętą konwersją numpy.array jest najszybszy.
źródło
numpyIndexValues
nie działa, ponieważa
,b
są typurange
. Domyślam się, że ment do konwersjia
,b
abynumpy.ndarrays
w pierwszej kolejności?Jestem pewien, że zostało to już wzięte pod uwagę: Jeśli liczba wskaźników wb jest niewielka i stała, można po prostu zapisać wynik w następujący sposób:
Lub nawet prościej, jeśli same wskaźniki są stałymi ...
Lub jeśli istnieje kolejny zakres indeksów ...
źródło
[a] + [b] = [a, b]
Oto prostszy sposób:
źródło
Moja odpowiedź nie korzysta z kolekcji numpy ani python.
Jednym trywialnym sposobem znajdowania elementów byłoby:
Wada: ta metoda może nie działać w przypadku większych list. Użycie numpy jest zalecane w przypadku większych list.
źródło
a
.[a[i] for i in b]
a
było jeszcze 5?[a[i] if i<len(a) else None for i in b]
Indeksy statyczne i mała lista?
Nie zapominaj, że jeśli lista jest niewielka, a indeksy się nie zmieniają, jak w twoim przykładzie, czasami najlepszą rzeczą jest użycie rozpakowywania sekwencji :
Wydajność jest znacznie lepsza i można również zapisać jeden wiersz kodu:
źródło
Rodzaj pythonowego sposobu:
źródło
O(n)
rozwiązanie wO(n^2)
rozwiązanie, a jednocześnie prawie podwoić długość kodu. Warto również zauważyć, że podejście zakończy się niepowodzeniem, jeśli lista zawiera obiekty będzie rozmyta lub częściowa równość, np. Jeślia
zawierafloat('nan')
, to zawsze podniesie aValueError
.