• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z usuwaniem elementów z listy w Python

0 głosów
847 wizyt
pytanie zadane 14 września 2021 w Python przez Gowi Użytkownik (830 p.)

Cześć,

przy testowaniu pętli for i usuwaniu z jej pomocą liczb parzystych z listy napotkałem na problem, który nie bardzo wiem jak rozwiązać.

thislist = [1,2,2,3,4]

for n in thislist:
    if n % 2 == 0:
        thislist.remove(n)
        print(n)
        print(thislist)

Wynik:

2
[1, 2, 3, 4]
4
[1, 2, 3]

Problem polega na tym, że usuwa liczby 2 i 4 z pominięciem jednej "dwójki". Natomiast samo działanie pętli for bez usuwania z listy wygląda tak:

thislist = [1,2,2,3,4]

for n in thislist:
    if n % 2 == 0:
        print(n)

Wynik:

2
2
4

1 odpowiedź

+1 głos
odpowiedź 14 września 2021 przez adrian17 Mentor (355,240 p.)
wybrane 21 września 2021 przez Gowi
 
Najlepsza

Ogólnie modyfikowanie listy podczas iteracji to jest zazwyczaj zły pomysł. W Twoim przypadku remove() powoduje, że iteracja "przeskoczy" jeden element.

Działającym ale brzydkim rozwiązaniem jest iterowanie po kopii listy (wtedy nie jest modyfikowana):

for n in list(thislist):
    if n % 2 == 0:
        thislist.remove(n)

Ale znacznie lepszym rozwiązaniem, w tym algorytmicznie, jest użycie list comprehension:

thislist = [n for n in thislist if n % 2 != 0]

 

komentarz 14 września 2021 przez Gowi Użytkownik (830 p.)
Dzięki wielkie Adrian, zwłaszcza za tę drugą opcję "list comprehension", której nie znałem, ale nazwa mi się obiła o uszy. Chyba bardziej zainteresuję się tym tematem
komentarz 22 września 2021 przez manjaro Nałogowiec (37,420 p.)

Zawsze też można iterować od końca:

thislist = [1,2,2,3,4]

for n in reversed(thislist):
    if n % 2 == 0:
        thislist.remove(n)
        print(n)
        print(thislist)

 

Podobne pytania

0 głosów
1 odpowiedź 1,754 wizyt
0 głosów
3 odpowiedzi 452 wizyt
pytanie zadane 19 lutego 2017 w C i C++ przez beniek_01 Nowicjusz (140 p.)
+1 głos
2 odpowiedzi 1,366 wizyt
pytanie zadane 27 lutego 2021 w JavaScript przez Darth Vader Początkujący (270 p.)

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...