Jak opróżnić listę?


356

Wydaje się tak „brudne” opróżnianie listy w ten sposób:

while len(alist) > 0 : alist.pop()

Czy istnieje wyraźny sposób, aby to zrobić?


28
Dlaczego więc słowniki i zestawy Pythona mają metodę clear (), ale nie listy?
praca

13
Ale jeśli istnieje wiele odwołań do obiektu, może być przydatny.
Ned Deily,

3
Może to być przydatne, jeśli muszę wyczyścić listę współdzieloną procesów w czasie wykonywania i nie muszę czekać na zniekształcenie (czy się mylę? Czy źle zrozumiałem zbieranie śmieci?). Również jeśli chcę sprawdzić każdy wyskakujący element, mogę go debugować, gdy nie mogę używać krojenia (lub się mylę). Nie muszę przerywać wykonywania procesu podczas czyszczenia mojej listy.
DrFalk3n,

2
@ S.Lott To, że nie rozumiesz, dlaczego jest to ważne, nie oznacza, że ​​reszta z nas tego nie rozumie. Jeśli wiele obiektów zależy od wspólnej listy, będzie to miało znaczenie. Jest to ważne w kilku wzorach projektowych. Śmieciarka oznacza, że ​​nie musisz sprzątać po sobie; to nie jest licencja, aby zrobić więcej bałaganu.
UpAndAdam

4
Niezależnie od innych, lepszych odpowiedzi, twój początkowy kod mógł zostać napisany: while alist: alist.pop ()
MrWonderful

Odpowiedzi:


570

To faktycznie usuwa zawartość z listy, ale nie zastępuje starej etykiety nową, pustą listą:

del lst[:]

Oto przykład:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Ze względu na kompletność przypisanie plasterka ma ten sam efekt:

lst[:] = []

Można go również użyć do zmniejszenia części listy przy jednoczesnej wymianie części (ale to nie wchodzi w zakres pytania).

Zauważ, że czynność lst = []nie powoduje opróżnienia listy, po prostu tworzy nowy obiekt i wiąże go ze zmienną lst, ale stara lista nadal będzie miała te same elementy, a efekt będzie widoczny, jeśli miał inne powiązania zmiennych.


3
Dwa kolejne pytania: Czym dokładnie jest „del”? (Wydedukuję to, że usuwa rzeczy, ale tak naprawdę nie wiem, co to jest) i po drugie: Jak czytasz (na głos) [:]
OscarRyz

2
Dla dokładnego wyjaśnienia del, odsyłam do dokumentacji: docs.python.org/reference/simple_stmts.html#the-del-statement
fortran

14
Zwykle nie czytam głośnego kodu python xD, ale gdybym musiał, powiedziałbym, że „odcinam od początku do końca listy l”.
fortran

2
@jellybean całkowicie niezamierzony ^ _ ^ Angielski nie jest moim językiem ojczystym, więc naprawdę nie zauważyłem kontrastu między tymi dwoma komentarzami.
fortran

jeśli zrobimy l = [] czy zawartość starej listy nie zostanie wyrzucona przez Python GC?
Alex Punnen

168

Jeśli używasz języka Python 3.3 lub nowszego, możesz użyć clear() metody list, która jest równoległa do clear()z dict, set, dequei inne rodzaje zmienny w opakowaniu:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

Podobnie jak w przypadku strony z dołączoną dokumentacją, to samo można osiągnąć za pomocą alist *= 0.

Podsumowując, istnieją cztery równoważne sposoby wyczyszczenia listy w miejscu (zupełnie w przeciwieństwie do Zen Pythona !):

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0

6
Ta odpowiedź powinna być na górze, co jest nie tak z przepływem stosu!
BreakBadSP

clear () jest lepszy.
sailfish009,

61

Możesz spróbować:

alist[:] = []

Co oznacza: Podziel na liście [](0 elementów) w miejscu [:](wszystkie indeksy od początku do końca)

[:] Jest operatorem wycinania. Zobacz to pytanie, aby uzyskać więcej informacji.


4
Dlaczego nie tylko alist = []?
mitenka

16
@mitenka, który nie opróżnia listy, zastępuje zmienną alistinną listą, która okazuje się być pusta. Jeśli ktoś miał odniesienie do oryginalnej listy, pozostaje ona taka, jaka jest (tzn. Zawiera to, co na niej było na początku)
Adam Batkin

@mitenka Innym powodem jest to, że alist.clear()albo alist[:] = []ułatwia sprawdzenie, czy alistrzeczywiście jest lista. Powiedz, że wróciłeś alistz funkcji foo(). Myślałeś, że foozwrócił listę, ale rzeczywiście zwrócił None. Korzystanie alist = []nie może złapać tego błędu.
aafulei

32

okazuje się, że w Pythonie 2.5.2 del l[:]jest nieco wolniejszy niż l[:] = []w 1.1 usec.

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2

1
W Pythonie 2.7.2 na moim komputerze są one mniej więcej takie same. Oba działają od 13,5 do 13,7 usec na pętlę.
leetNightshade

Powinieneś także zmierzyć python3 -mtimeit "l = lista (zakres (1000))" "b = l [:]", aby obliczyć "b [:] = []" i "del b [:]". Zrób to i lol ...
rockdaboot

1
Zrobiłem test porównawczy z python 3.5 i zgadzam się z leetNightshade. .clear(), del b[:]i b[:]=[]wszystko przebiega tak samo ( b[:]=[]jest nieco wolniejsze.
Conchylicultor

5
lst *= 0

ma taki sam efekt jak

lst[:] = []

Jest to trochę prostsze i może łatwiejsze do zapamiętania. Poza tym nie ma wiele do powiedzenia

Wydajność wydaje się być prawie taka sama


1
Dla kompletności warto wspomnieć, że każda liczba całkowita mniejsza lub równa 0miałaby ten sam efekt. Jest to całkiem fajna sztuczka, jestem trochę smutny, że nie spotkała się z dużym zainteresowaniem ..
Peter Varo

-1
list = []

zresetuje się listdo pustej listy.

Zauważ, że generalnie nie powinieneś ukrywać nazw funkcji zarezerwowanych, takich jak listkonstruktor obiektu listy - możesz na przykład użyć lstlub list_zamiast tego.


38
Nie: to nie zmodyfikuje listy, to po prostu przypisuje pustą listę do zmiennej list. Jeśli spodziewałeś się, że funkcja zmodyfikuje przekazaną listę (na przykład), nie zrobi tego, co chcesz.
Adam Batkin

10
Nie całkiem. Pytanie brzmi: „Jak wyczyścić listę” nie „Jak przypisać nad zmienną, która zawiera listę”
Adam Batkin

6
pytanie nie było dwuznaczne, fragment kodu operacji wyrzucał elementy z listy (to tyle, modyfikując je na miejscu) ...
fortran

7
Ponadto „lista” nie powinna być używana jako nazwa zmiennej, ponieważ jest cieniem typu „lista”. Wielu programistów Python używa „L” jako nazwy zmiennej listy, ale wolę „lst”.
steveha,

1
Czasami chcesz po prostu opróżnić listę i jest to tak dobre, jak każda z proponowanych metod. Prawdopodobnie jeszcze szybciej
smac89

-3

Kolejny prosty kod, którego można użyć (w zależności od sytuacji):

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Musisz zacząć indeks od długości listy i przejść do tyłu w stosunku do indeksu od 0, do przodu, ponieważ w ten sposób otrzymamy indeks równy długości listy z przecięciem tylko o połowę.

Upewnij się również, że linia while ma znak „większy niż lub równy”. Pominięcie tego spowoduje pozostawienie listy [0].


15
wynalezienie koła z sześcianem
CONvid19,

Ha ha. To druga dziwna odpowiedź (+ odpowiedni komentarz), którą spotkałem na SO. Powinna być strona z tymi niezapomnianymi rzeczami: D
akinuri
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.