Jak usunąć element z listy według indeksu

Jak usunąć element z listy przez indeks w Pythonie?

Znalazłem metodę list.remove, ale powiedzmy, że chcę usunąć ostatni element, jak to zrobić? Wygląda na to, że domyślne Usuń przeszukuje listę, ale nie chcę, aby wyszukiwanie było wykonywane.

 1698
Author: Peter Mortensen, 2009-03-09

18 answers

Użyj del i określ indeks elementu, który chcesz usunąć:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Obsługuje również plastry:

>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]

Tutaj znajduje się sekcja z samouczka.

 1955
Author: Neil Chowdhury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 03:18:39

Prawdopodobnie chcesz pop:

a = ['a', 'b', 'c', 'd']
a.pop(1)

# now a is ['a', 'c', 'd']

Domyślnie, pop bez żadnych argumentów usuwa ostatnią pozycję:

a = ['a', 'b', 'c', 'd']
a.pop()

# now a is ['a', 'b', 'c']
 713
Author: Jarret Hardie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 18:17:48

Podobnie jak inne wspomniane pop i del są skutecznymi sposobami usuwania elementu z podanego indeksu. Jednak tylko ze względu na ukończenie (ponieważ to samo można zrobić na wiele sposobów w Pythonie): {]}

Za pomocą plasterków (nie powoduje to usunięcia elementu z oryginalnej listy):

(również będzie to najmniej efektywna metoda podczas pracy z listą Pythona, ale może być przydatna (ale nie wydajna, powtarzam) podczas pracy z obiektami zdefiniowanymi przez użytkownika które nie obsługują pop, a jednak definiują __getitem__ ):

>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index

>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]

Uwaga: należy pamiętać, że ta metoda nie modyfikuje listy w miejscu, jak pop i del. Zamiast tego tworzy dwie kopie list (jedną Od początku do indeksu, ale bez niego (a[:index]) i jedną po indeksie do ostatniego elementu (a[index+1:])) i tworzy nowy obiekt list przez dodanie obu. Jest to następnie przypisane do zmiennej list (a). Stary obiekt listy jest więc zdereferowany, a co za tym idzie zbierane śmieci (pod warunkiem, że oryginalny obiekt list nie jest odwołany przez żadną zmienną inną niż a).

To sprawia, że ta metoda jest bardzo nieefektywna i może również wywoływać niepożądane skutki uboczne (zwłaszcza gdy inne zmienne wskazują na oryginalny obiekt list, który pozostaje niezmodyfikowany).

Dzięki @ MarkDickinson za wskazanie tego ...

Ta odpowiedź przepełnienie stosu wyjaśnia pojęcie krojenia.

Zauważ również, że działa to tylko z pozytywnym indeksy.

Podczas używania z obiektami, metoda __getitem__ musi być zdefiniowana i co ważniejsze __add__ metoda musi być zdefiniowana, aby zwrócić obiekt zawierający elementy z obu operandów.

W istocie działa to z dowolnym obiektem, którego definicja klasy jest następująca:

class foo(object):
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return foo(self.items[index])

    def __add__(self, right):
        return foo( self.items + right.items )

To działa z list, który definiuje __getitem__ i __add__ metody.

Porównanie trzech sposobów pod względem wydajności:

Załóżmy, że następująca jest predefiniowana:

a = range(10)
index = 3

Metoda del object[index]:

Zdecydowanie najskuteczniejsza metoda. Działa to wszystkie obiekty definiujące metodę __del__.

Demontaż wygląda następująco:

Kod:

def del_method():
    global a
    global index
    del a[index]

Demontaż:

 10    0 LOAD_GLOBAL     0 (a)
       3 LOAD_GLOBAL     1 (index)
       6 DELETE_SUBSCR   # This is the line that deletes the item
       7 LOAD_CONST      0 (None)
      10 RETURN_VALUE
None

pop metoda:

Jest mniej wydajny niż metoda del i jest używany, gdy trzeba uzyskać usunięte pozycji.

Kod:

def pop_method():
    global a
    global index
    a.pop(index)

Demontaż:

 17     0 LOAD_GLOBAL     0 (a)
        3 LOAD_ATTR       1 (pop)
        6 LOAD_GLOBAL     2 (index)
        9 CALL_FUNCTION   1
       12 POP_TOP
       13 LOAD_CONST      0 (None)
       16 RETURN_VALUE

Plasterek i dodać metodę.

Najmniej wydajny.

Kod:

def slice_method():
    global a
    global index
    a = a[:index] + a[index+1:]

Demontaż:

 24     0 LOAD_GLOBAL    0 (a)
        3 LOAD_GLOBAL    1 (index)
        6 SLICE+2
        7 LOAD_GLOBAL    0 (a)
       10 LOAD_GLOBAL    1 (index)
       13 LOAD_CONST     1 (1)
       16 BINARY_ADD
       17 SLICE+1
       18 BINARY_ADD
       19 STORE_GLOBAL   0 (a)
       22 LOAD_CONST     0 (None)
       25 RETURN_VALUE
None

Uwaga: we wszystkich trzech demontażach ignoruj dwie ostatnie linie, które w zasadzie są return None. Również pierwsze dwie linie ładują wartości globalne a i index.

 151
Author: Raghav RV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-23 23:26:18

pop jest również przydatny do usuwania i utrzymywania pozycji z listy. Gdzie del faktycznie niszczy przedmiot.

>>> x = [1, 2, 3, 4]

>>> p = x.pop(1)
>>> p
    2
 55
Author: boatcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 08:18:12

Jeśli chcesz usunąć określony element pozycji na liście, taki jak 2, 3 i 7. nie możesz używać

del my_list[2]
del my_list[3]
del my_list[7]

Ponieważ po usunięciu drugiego elementu, trzeci element, który usuniesz, jest czwartym elementem na oryginalnej liście. Możesz filtrować 2, 3 i 7 element w oryginalnej liście i uzyskać nową listę, jak poniżej:

new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]]
 28
Author: xiaojia zhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 02:38:14

Ogólnie stosuję następującą metodę:

>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]
 20
Author: Mayur Koshti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 12:23:32

To zależy od tego, co chcesz zrobić.

Jeśli chcesz zwrócić element, który usunąłeś, użyj pop():

>>> l = [1, 2, 3, 4, 5]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5]

Jeśli jednak chcesz usunąć element, użyj del:

>>> l = [1, 2, 3, 4, 5]
>>> del l[2]
>>> l
[1, 2, 4, 5]

Dodatkowo, del pozwala na użycie plastrów (np. del[2:]).

 20
Author: Neil Chowdhury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 00:17:13

Yet another way to remove a element(s) from a list by index.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# remove the element at index 3
a[3:4] = []
# a is now [0, 1, 2, 4, 5, 6, 7, 8, 9]

# remove the elements from index 3 to index 6
a[3:7] = []
# a is now [0, 1, 2, 7, 8, 9]

A [X:y] wskazuje na elementy z indeksu x do y-1. Gdy zadeklarujemy tę część listy jako pustą listę ([]), elementy te zostaną usunięte.

 18
Author: Andreas Chatzivasileiadis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 05:51:39

Już wspomniano, jak usunąć pojedynczy element z listy i jakie zalety mają różne metody. Należy jednak pamiętać, że usunięcie wielu elementów może powodować błędy:

>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in indices:
...     del l[i]
... 
>>> l
[0, 1, 2, 4, 5, 6, 7, 9]

Elementy 3 i 8 (nie 3 i 7) oryginalnej listy zostały usunięte (ponieważ lista została skrócona podczas pętli), co mogło nie być zamierzone. Jeśli chcesz bezpiecznie usunąć wiele indeksów, zamiast tego Usuń elementy o najwyższym indeksie po pierwsze, np. tak:

>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in sorted(indices, reverse=True):
...     del l[i]
... 
>>> l
[0, 1, 2, 4, 5, 6, 8, 9]
 17
Author: nspo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-20 13:13:03

Możesz po prostu wyszukać element, który chcesz usunąć. To naprawdę proste. Przykład:

    letters = ["a", "b", "c", "d", "e"]
    letters.remove(letters[1])
    print(*letters) # Used with a * to make it unpack you don't have to (Python 3.x or newer)

Wyjście: a c d e

 14
Author: SollyBunny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-23 23:28:17

Użyj następującego kodu, aby usunąć element z listy:

list = [1, 2, 3, 4]
list.remove(1)
print(list)

output = [2, 3, 4]

Jeśli chcesz usunąć dane elementu indeksu z listy użyj:

list = [1, 2, 3, 4]
list.remove(list[2])
print(list)
output : [1, 2, 4]
 12
Author: jitsm555,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-22 15:26:12

Użyj del oświadczenie:

del listName[-N]

Na przykład, jeśli chcesz usunąć Ostatnie 3 elementy, Twój kod powinien być:

del listName[-3:]

Na przykład, jeśli chcesz usunąć ostatnie 8 elementów, Twój kod powinien być:

del listName[-8:]
 12
Author: lloydyu24,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-01 06:10:40

L - Lista wartości; musimy usunąć indeksy z listy inds2rem.

l = range(20)
inds2rem = [2,5,1,7]
map(lambda x: l.pop(x), sorted(inds2rem, key = lambda x:-x))

>>> l
[0, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
 10
Author: Jo Ja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 17:02:10

Jak wcześniej wspomniano, najlepszą praktyką jest del (); lub pop (), jeśli chcesz znać wartość.

Alternatywnym rozwiązaniem jest ponowne ułożenie tylko tych elementów, które chcesz:

    a = ['a', 'b', 'c', 'd'] 

    def remove_element(list_,index_):
        clipboard = []
        for i in range(len(list_)):
            if i is not index_:
                clipboard.append(list_[i])
        return clipboard

    print(remove_element(a,2))

    >> ['a', 'b', 'd']

Eta: hmm... nie będzie działać na ujemnych wartościach indeksu, rozważy i zaktualizuje

Przypuszczam

if index_<0:index_=len(list_)+index_
/ Align = "left" / .. ale nagle ten pomysł wydaje się bardzo kruchy. Ciekawy eksperyment myślowy. Wygląda na to, że powinien być 'właściwy' sposób, aby to zrobić z append () / list comprehension.

rozważania

 9
Author: litepresence,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 14:48:58

Nie wygląda na to, że pracujesz z listą list, więc będę się streszczał. Chcesz użyć pop ponieważ usunie elementy, a nie elementy, które są listami, powinieneś użyć del do tego. Aby wywołać ostatni element w Pythonie to jest " -1 "

>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']
 9
Author: Mo Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 14:29:51

Lub jeśli należy usunąć wiele indeksów:

print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])

Oczywiście wtedy można też zrobić:

print([v for i,v in enumerate(your_list) if i != unwanted_index])
 6
Author: U11-Forward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 06:13:08

Możesz użyć del lub pop, aby usunąć element z listy na podstawie indeksu. Pop wydrukuje członka, którego usuwa z listy, podczas gdy lista usuwa tego członka bez jego drukowania.

>>> a=[1,2,3,4,5]
>>> del a[1]
>>> a
[1, 3, 4, 5]
>>> a.pop(1)
 3
>>> a
[1, 4, 5]
>>> 
 4
Author: Aashutosh jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 04:59:14

Można użyć del lub pop, ale wolę del, ponieważ można określić indeks i plasterki, dając użytkownikowi większą kontrolę nad danymi.

Na przykład, zaczynając od pokazanej listy, można usunąć jego ostatni element za pomocą del jako plasterka, a następnie można usunąć ostatni element z wyniku za pomocą pop.

>>> l = [1,2,3,4,5]
>>> del l[-1:]
>>> l
[1, 2, 3, 4]
>>> l.pop(-1)
4
>>> l
[1, 2, 3]
 4
Author: pyman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-17 15:02:17