>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>>
Czy jest jakaś różnica między powyższymi trzema metodami usuwania elementu z listy?
>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>>
Czy jest jakaś różnica między powyższymi trzema metodami usuwania elementu z listy?
Odpowiedzi:
Tak, remove
usuwa pierwszą pasującą wartość , a nie konkretny indeks:
>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]
del
usuwa element pod określonym indeksem:
>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]
i pop
usuwa element pod określonym indeksem i zwraca go.
>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]
Ich tryby błędów również są różne:
>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
del
to nie jest przechowywanie składni, nie. Składnia jest niezmieniona, podobnie jak return
lub if
lub while
.
del
przykład jest nieco mylący. Który element jest dokładnie usuwany? 2. czy 3.? Powinieneś był użyć [9, 8, 7, 6]
, del a[1]
i[9, 7, 6]
Użyj, del
aby usunąć element według indeksu, pop()
aby usunąć go według indeksu, jeśli potrzebujesz zwróconej wartości, i remove()
aby usunąć element według wartości. Ten ostatni wymaga przeszukania listy i podnosi, ValueError
jeśli taka wartość nie występuje na liście.
Podczas usuwania indeksu i
z listy n
elementów złożoność obliczeniowa tych metod wynosi
del O(n - i)
pop O(n - i)
remove O(n)
del
jest to nieco szybsze, ale z innego powodu: wyszukiwanie __delitem__
typu zaimplementowanego w C odbywa się raczej za pomocą indeksu niż nazwy, podczas gdy pop
należy sprawdzić w oparciu o cały protokół deskryptora. Wykonanie samych funkcji powinno zająć tyle samo czasu. Oba zwracają wskaźnik - jeden do usuniętego obiektu, drugi do None
.
Ponieważ nikt o tym nie wspominał, zwróć uwagę, że del
(w przeciwieństwie do pop
) pozwala na usunięcie szeregu indeksów z powodu dzielenia listy:
>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]
Pozwala to również uniknąć sytuacji, IndexError
gdy indeksu nie ma na liście:
>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]
Odpowiedzieli już inni. Ten z mojego końca :)
Najwyraźniej pop
jest jedynym, który zwraca wartość i remove
jest jedynym, który przeszukuje obiekt, del
ograniczając się do prostego usunięcia.
Istnieje wiele najlepszych wyjaśnień, ale postaram się jak najlepiej uprościć.
Spośród wszystkich tych metod, odwrotność i pop to postfiks, podczas gdy delete to prefiks .
remove (): Służy do usuwania pierwszego wystąpienia elementu
remove(i)
=> pierwsze wystąpienie wartości i
>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2) # where i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]
pop (): Służył do usuwania elementu, jeśli:
nieokreślony
pop()
=> od końca listy
>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]
określony
pop(index)
=> indeksu
>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]
delete () : Jest to metoda przedrostka.
Obserwuj dwie różne składnie tej samej metody: [] i (). Posiada moc do:
1.Usuń indeks
del a[index]
=> służy do usuwania indeksu i powiązanej z nim wartości, podobnie jak pop.
>>>del a[1]
>>>a
[0, 1, 4, 6, 5]
2.Usuń wartości z zakresu [indeks 1: indeks N]
del a[0:3]
=> wiele wartości w zakresie
>>>del a[0:3]
>>>a
[6, 5]
3.Ostatnia, ale nie lista, aby usunąć całą listę w jednym ujęciu
del (a)
=> jak powiedziano powyżej.
>>>del (a)
>>>a
Mam nadzieję, że to wyjaśni zamieszanie, jeśli w ogóle.
pop - przyjmuje indeks i zwraca wartość
remove - Pobiera wartość, usuwa pierwsze wystąpienie i nic nie zwraca
delete - pobiera indeks, usuwa wartość pod tym indeksem i nic nie zwraca
Każda operacja / funkcja na różnych strukturach danych jest zdefiniowana dla poszczególnych działań. Tutaj w twoim przypadku, tj. Usunięcie elementu, usuń, pop i usuń. (Jeśli weźmiesz pod uwagę zestawy, dodaj kolejną operację - odrzuć) Innym mylącym przypadkiem jest dodanie. Wstaw / dołącz. Dla celów demonstracyjnych zastosujmy deque. deque to hybrydowa liniowa struktura danych, w której można dodawać elementy / usuwać elementy z obu końców. (tył i przód)
class Deque(object):
def __init__(self):
self.items=[]
def addFront(self,item):
return self.items.insert(0,item)
def addRear(self,item):
return self.items.append(item)
def deleteFront(self):
return self.items.pop(0)
def deleteRear(self):
return self.items.pop()
def returnAll(self):
return self.items[:]
Tutaj zobacz operacje:
def deleteFront(self):
return self.items.pop(0)
def deleteRear(self):
return self.items.pop()
Operacje muszą coś zwrócić. Tak więc pop - z indeksem i bez. Jeśli nie chcę zwracać wartości: del self.items [0]
Usuń według wartości, a nie indeksu:
usuń:
list_ez=[1,2,3,4,5,6,7,8]
for i in list_ez:
if i%2==0:
list_ez.remove(i)
print list_ez
rozważmy przypadek zbiorów.
set_ez=set_ez=set(range(10))
set_ez.remove(11)
# Gives Key Value Error.
##KeyError: 11
set_ez.discard(11)
# Does Not return any errors.
Podczas pop i usuń oba wziąć indeksy, aby usunąć element, jak podano w powyższych komentarzach. Kluczową różnicą jest dla nich złożoność czasu. Złożoność czasu dla pop () bez indeksu wynosi O (1), ale nie jest tak samo w przypadku usuwania ostatniego elementu.
Jeśli twoim przypadkiem użycia jest zawsze usunięcie ostatniego elementu, zawsze lepiej jest użyć pop () niż delete (). Więcej wyjaśnień dotyczących zawiłości czasowych można znaleźć na stronie https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
delete
. Różnice polegają na tym, że pop
zwraca wartość i del
działa na plasterki. W przypadkach, w których pop
działa, del
ma dokładnie taką samą złożoność obliczeniową (i jest nieco szybszy o stały składnik).
Operacja usuwania na liście otrzymuje wartość do usunięcia. Przeszukuje listę, aby znaleźć element o tej wartości, i usuwa pierwszy pasujący znaleziony element. Jest to błąd, jeśli nie ma pasującego elementu, powoduje błąd ValueError .
>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
del x[7]
IndexError: list assignment index out of range
Za pomocą instrukcji del można usunąć całą listę. Jeśli masz określony element listy jako argument do usunięcia (np. Nazwa listy [7], aby konkretnie odwoływać się do ósmego elementu na liście), po prostu usunie ten element. Możliwe jest nawet usunięcie „plasterka” z listy. Jest to błąd, jeśli indeks jest poza zakresem, podnosi błąd IndexError .
>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
del x[4]
IndexError: list assignment index out of range
Zwykle używa się popu do usunięcia ostatniego elementu z listy, gdy używasz listy jako stosu. W przeciwieństwie do del, pop zwraca wartość, która spadła z listy. Opcjonalnie możesz podać wartość indeksu dla pop i pop z innego niż koniec listy (np. Listname.pop (0) usunie pierwszy element z listy i zwróci ten pierwszy element jako wynik). Możesz użyć tego, aby lista zachowywała się jak kolejka, ale dostępne są procedury biblioteczne, które mogą zapewnić operacje w kolejce z lepszą wydajnością niż pop (0). Jest to błąd, jeśli indeks jest poza zakresem, podnosi błąd IndexError .
>>> x = [1, 2, 3]
>>> x.pop(2)
3
>>> x
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
x.pop(4)
IndexError: pop index out of range
Zobacz kolekcje.deque po więcej szczegółów.
Usuń zasadniczo działa na wartości. Usuń i pop pracy na indeksie
Usuń zasadniczo usuwa pierwszą pasującą wartość. Usuń usuwa element z określonego indeksu. Pop zasadniczo pobiera indeks i zwraca wartość pod tym indeksem. Następnym razem, gdy wydrukujesz listę, wartość nie pojawi się.
Możesz także użyć opcji usuń, aby usunąć wartość według indeksu.
n = [1, 3, 5]
n.remove(n[1])
n odnosi się wtedy do [1, 5]
n = [5, 3, 5]
więc n.remove(n[2])
.
n.remove(n[2])
usuwa n[0]
, a nie n[2]
. Więc to nie tylko czas liniowy bez powodu (może nie jest to wielka sprawa, gdy N = 3), ale także źle (duża sprawa bez względu na to, co N)