Czy istnieje prosty sposób indeksowania wszystkich elementów listy (lub tablicy itp.) Z wyjątkiem określonego indeksu? Na przykład,
mylist[3]
zwróci element na pozycji 3milist[~3]
zwróci całą listę z wyjątkiem 3
Aby uzyskać listę , możesz użyć kompilacji list. Na przykład, aby wykonać b
kopię a
bez trzeciego elementu:
a = range(10)[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
b = [x for i,x in enumerate(a) if i!=3] # [9, 8, 7, 5, 4, 3, 2, 1, 0]
Jest to bardzo ogólne i można go używać ze wszystkimi iteracjami, w tym tablicami numpy. Jeśli zastąpi []
się ()
, b
będzie iterator zamiast listy.
Lub możesz to zrobić na miejscu za pomocą pop
:
a = range(10)[::-1] # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
a.pop(3) # a = [9, 8, 7, 5, 4, 3, 2, 1, 0]
W numpy możesz to zrobić za pomocą indeksowania boolowskiego:
a = np.arange(9, -1, -1) # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
b = a[np.arange(len(a))!=3] # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0])
co na ogół będzie znacznie szybsze niż zrozumienie listy wymienione powyżej.
>>> l = range(1,10)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:2]
[1, 2]
>>> l[3:]
[4, 5, 6, 7, 8, 9]
>>> l[:2] + l[3:]
[1, 2, 4, 5, 6, 7, 8, 9]
>>>
Zobacz też
numpy.concatenate
.Najprostszy sposób, jaki znalazłem, to:
który utworzy twój
mylist
bez elementu o indeksiex
.źródło
Jeśli używasz numpy, najbliższy, jaki przychodzi mi do głowy, to użycie maski
Coś podobnego można osiągnąć
itertools
beznumpy
źródło
np.arange(len(arr)) != 3
maski, ponieważ wtedy można ją wstawić, nparr[~(np.arange(len(arr)) == 3)]
. Czy cokolwiek.Użyj
np.delete
! W rzeczywistości nie usuwa niczego w miejscuPrzykład:
źródło
Przedstawię funkcjonalny (niezmienny) sposób na zrobienie tego.
Standardowym i łatwym sposobem na to jest użycie krojenia:
Wynik:
Użyj rozumienia list:
Wynik:
Użyj funkcji filtra:
Wynik:
Korzystanie z maskowania. Maskowanie zapewnia funkcja itertools.compress w standardowej bibliotece:
Wynik:
Użyj funkcji itertools.filterfalse ze standardowej biblioteki Pythona
Wynik:
źródło
Jeśli nie znasz wcześniej indeksu, oto funkcja, która będzie działać
źródło
Zauważ, że jeśli zmienna jest listą list, niektóre podejścia nie powiodą się. Na przykład:
W ogólnym przypadku użyj
źródło
Jeśli chcesz wyciąć ostatnią lub pierwszą, zrób to:
Jeśli zmienisz 1 na 2, pierwsze 2 znaki zostaną usunięte, a nie drugie. Mam nadzieję, że to nadal pomaga!
źródło