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ć?
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ć?
Odpowiedzi:
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.
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
, deque
i 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 !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
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.
alist = []
?
alist
inną 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)
alist.clear()
albo alist[:] = []
ułatwia sprawdzenie, czy alist
rzeczywiście jest lista. Powiedz, że wróciłeś alist
z funkcji foo()
. Myślałeś, że foo
zwrócił listę, ale rzeczywiście zwrócił None
. Korzystanie alist = []
nie może złapać tego błędu.
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
.clear()
, del b[:]
i b[:]=[]
wszystko przebiega tak samo ( b[:]=[]
jest nieco wolniejsze.
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
0
miałaby ten sam efekt. Jest to całkiem fajna sztuczka, jestem trochę smutny, że nie spotkała się z dużym zainteresowaniem ..
list = []
zresetuje się list
do pustej listy.
Zauważ, że generalnie nie powinieneś ukrywać nazw funkcji zarezerwowanych, takich jak list
konstruktor obiektu listy - możesz na przykład użyć lst
lub list_
zamiast tego.
list
. Jeśli spodziewałeś się, że funkcja zmodyfikuje przekazaną listę (na przykład), nie zrobi tego, co chcesz.
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].