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

Python, obliczenia

Object Storage Arubacloud
+2 głosów
378 wizyt
pytanie zadane 5 lutego 2023 w Python przez Steady Obywatel (1,140 p.)

Hej, 

jestem na początku swojej nauki z python i natknąłem sie na jeden problem podczas robienia kursu.

Mam taki kod 

items = [1, 3, 4, 5, 6, 9, 10, 17, 23, 24]

for liczba in items:
    if liczba % 2 != 0:
        items.remove(liczba)

print(items)

Zadanie polega na tym żeby wydrukować parzyste liczby. Z tego kodu dostaje 

[3, 4, 6, 10, 23, 24]

 

Moglby mi ktos wytlumaczyc dlatego 3 i 23 jest w tej grupie? Pewnie odpowiedz jest prosta tylko moj mozg juz nie pracuje takze liczbe na mile wytlumaczenie

2
komentarz 5 lutego 2023 przez Whistleroosh Maniak (56,980 p.)

Standardowy błąd początkującego

2
komentarz 5 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
Zamiast usuwać elementy (co jest dość kosztowne) po prostu bym je drukował / print-ował (bo chyba taki jest cel zadania??), albo dołączał do nowej listy wynikowej (gdzie znalazłyby się tylko interesujące liczby).
komentarz 5 lutego 2023 przez Steady Obywatel (1,140 p.)

@Whistleroosh, super. Dzieki bardzo za szybką odpowiedz!

4 odpowiedzi

+1 głos
odpowiedź 5 lutego 2023 przez Velta Maniak (52,370 p.)

Operujesz na tej samej liście, więc podczas iteracji niektóre elementy są pomijane.

Iteruj po kopii:

for item in items[:]:
    if item % 2 != 0:
        items.remove(item)

Albo użyj one-linera:

items = [item for item in items if item % 2 == 0]

 

komentarz 5 lutego 2023 przez Steady Obywatel (1,140 p.)
Dzięki bardzo! Już zrozumiałem gdzie mój błąd
komentarz 5 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)

To rozwiązanie na kopii najbardziej mi się podoba.

+1 głos
odpowiedź 5 lutego 2023 przez tangarr Mędrzec (154,860 p.)

Z góry zaznaczam, że nie programuję w pythonie. Jednak pytanie wydało mi się interesujące.
Zmodyfikowałem lekko twój kod, żeby zdebugować co się dzieje

items = [1, 3, 4, 5, 6, 9, 10, 17, 23, 24]
 
for liczba in items:
    print("items:", items, "liczba:", liczba)
    if liczba % 2 != 0:
        print("usun:", liczba)
        items.remove(liczba)
 
print(items)

Pętla sprawdza liczby 1,4,5,9,17,24
Wygląda że python podczas iteracji używa ukrytego przed użytkownikiem indeksu. Python nie jest w stanie wykryć, że kontener po którym iteruje został zmieniony, dlatego po usunięciu elementu pętla "omija" kolejny element.

komentarz 5 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)

Dokładnie - Whistleroosh  o tym napisał w komentarzu wyżej.

 

 

1
komentarz 5 lutego 2023 przez tangarr Mędrzec (154,860 p.)
Myślałem, że będę pierwszy, ale kolega mnie uprzedził gdy testowałem kod. Zdarza się.
1
komentarz 5 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
Na Pasja Informatyki liczą się nanosekundy!
komentarz 5 lutego 2023 przez Steady Obywatel (1,140 p.)

@tangarr, Dziękuje bardzo za poświęcony czas! Już rozumiem co i jak :D

+1 głos
odpowiedź 5 lutego 2023 przez mokrowski Mędrzec (155,460 p.)

Wiem że nie na początku, ale już na początku nauki warto wiedzieć że jest coś takiego jak (polska nazwa: generatorowa postać listy, ang: list comprehension). I takie zadania jak to, w zasadzie taką postacią kodu można zrealizować najszybciej:

items = [1, 3, 4, 5, 6, 9, 10, 17, 23, 24]
 
print([elem for elem in items if not elem % 2])

 

komentarz 5 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
Oprócz krótkiego zapisu, list comprehensions w niektórych wypadkach są szybsze od zapisu w formie pętli.
komentarz 6 lutego 2023 przez Steady Obywatel (1,140 p.)

@mokrowski, Właśnie podczas szukania odpowiedzi do tego zadania natknąłem się na taki zapis i staram się  powoli wprowadzać to też u siebie w zycie bo serio to duze ulatwienie mi sie wydaje

+1 głos
odpowiedź 5 lutego 2023 przez VBService Ekspert (253,420 p.)

Proponuję użyć filter

[ on-line ]

items = [1, 3, 4, 5, 6, 9, 10, 17, 23, 24]
  
   
print(list(filter(lambda v: v % 2 == 0, items)))

 

Podobne pytania

0 głosów
1 odpowiedź 232 wizyt
0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 23 maja 2021 w Matematyka, fizyka, logika przez Metarinda Użytkownik (740 p.)
+1 głos
1 odpowiedź 456 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...