När en lista innehåller fel post, en för många kopior eller ett element på fel plats behöver du välja hur borttagningen ska gå till. Oftast räcker remove(), men metoden tar bara bort den första matchningen och kan ge ett fel om värdet saknas.

Välj metod efter vad du vet om elementet
- Känt värde: använd
remove()för att ta bort den första matchningen. - Känt index: använd
pop()om du behöver få tillbaka elementet, ellerdelom du inte behöver det. - Alla matchningar: skapa en ny lista med en list comprehension.
- Säker mot saknat värde: kontrollera först med
in, eller fångaValueError.
Ta bort efter värde med remove()
Om du vet vilket värde som ska bort men inte var det står, är remove() det raka valet. Metoden söker från början och tar bort den första matchningen, så upprepade värden kräver ett extra beslut.
sprak = ["Python", "Java", "Python", "Ruby"]
sprak.remove("Python")
print(sprak)
# ["Java", "Python", "Ruby"]Finns värdet inte i listan får du ett ValueError. Om det är normalt att värdet saknas kan du skydda anropet med en medlemskontroll:
if "Go" in sprak:
sprak.remove("Go")Kontrollen gör koden tydlig, men listan söks igen när remove() körs. Jag tycker att det är en rimlig avvägning när saknade värden är vanliga och ett undantag skulle störa flödet. Är det däremot ett fel att värdet saknas, låt undantaget synas eller hantera det uttryckligen. Pythons dokumentation om listor beskriver både beteendet och felet.
Använd index när positionen är det viktiga
Om du redan har positionen i listan behöver du inte söka efter ett värde. pop(index) tar bort elementet på den positionen och returnerar det, medan del raderar elementet utan att lämna tillbaka det.
filer = ["rapport.csv", "utkast.txt", "bild.png"]
borttagen = filer.pop(1)
print(borttagen) # utkast.txt
del filer[0]
print(filer) # ["bild.png"]Välj pop() när elementet ska användas efter borttagningen, till exempel när en uppgift hämtas ur en kö eller ett objekt tas från en arbetslista. Välj del när du bara vill radera en position eller ett intervall, som del filer[1:3]. Ett index utanför listans gränser leder till IndexError, så kontrollera att indexet verkligen finns om det kommer från användardata.
| Situation | Trolig orsak eller följd | Gör så här |
|---|---|---|
| Du vet värdet, men inte positionen | remove() tar den första matchningen |
Använd remove(värde) |
| Du behöver det borttagna elementet | del returnerar inget element |
Använd pop(index) |
| Värdet kan saknas | remove() kan ge ValueError |
Kontrollera med in eller hantera undantaget |
| Varje post som matchar villkoret ska bort | Ett enstaka remove() lämnar senare matchningar kvar |
Filtrera fram en ny lista |
Filtrera fram en ny lista när flera element ska bort
Tre etiketter med samma namn i en lista kan se ut som ett jobb för flera remove()-anrop. Men när borttagningen beror på ett villkor blir en list comprehension oftast lättare att läsa och säkrare än att ändra listan medan du går igenom den.
etiketter = ["klar", "utkast", "klar", "granska"]
etiketter = [etikett for etikett in etiketter
if etikett != "klar"]
print(etiketter)
# ["utkast", "granska"]Uttrycket bygger en ny lista och behåller ordningen på de element som klarar villkoret. Det är praktiskt när du tar bort alla likadana värden eller rensar poster enligt ett kriterium, exempelvis tomma strängar. Om andra delar av programmet behöver se ändringen i samma listobjekt, tilldela resultatet via en hel slice i stället:
etiketter[:] = [etikett for etikett in etiketter
if etikett != "klar"]Den skillnaden handlar om listans identitet, inte bara innehållet. En annan variabel som pekar på samma lista ser ändringen när slice-tilldelningen används, medan vanlig tilldelning låter den gamla listan vara kvar. Python-dokumentationen rekommenderar också att skapa en ny lista framför att ändra listan under iteration.
Att ta bort under en loop kan hoppa över element
En loop som raderar poster ur listan den går igenom kan ge ett resultat som överraskar. När ett element försvinner flyttas senare element ett steg, medan loopens position går vidare, och då kan nästa träff passera obemärkt.
tal = [2, 4, 6, 7]
for nummer in tal:
if nummer % 2 == 0:
tal.remove(nummer)
print(tal)
# Kan lämna kvar ett jämnt talFör att ta bort alla jämna tal är filtrering tydligare:
tal = [nummer for nummer in tal if nummer % 2 != 0]Om det ursprungliga listobjektet måste behållas, använd slice-tilldelning med samma villkor. Då undviker du att iteratorn arbetar mot en lista som ändras mitt i genomgången.
Välj metod efter vad programmet behöver bevara
Det enklaste valet är ofta det rätta: remove() för ett känt värde, pop() för en position vars element ska tas tillvara och en list comprehension när flera poster ska filtreras bort. Kontrollera särskilt dubbletter, saknade värden och om listobjektet måste behålla sin identitet; de detaljerna avgör om borttagningen blir förutsägbar även när listan förändras.