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

Umiejscowienie pętli for w metodzie append().

Object Storage Arubacloud
+1 głos
113 wizyt
pytanie zadane 6 października 2023 w Python przez wojtek_programista Nowicjusz (170 p.)

Witam serdecznie, próbowałem rozwiązać zadanie maturalne o poniższej treści(maj 2017, zadanie 6.3 - Piksele):

W pliku dane.txt znajduje się 200 wierszy. Każdy wiersz zawiera 320 liczb naturalnych z przedziału od 0 do 255, oddzielonych znakami pojedynczego odstępu (spacjami). Przedstawiają one jasności kolejnych pikseli czarno-białego obrazu o wymiarach 320 na 200 pikseli (od 0 – czarny do 255 – biały). 
Sąsiednie piksele to takie, które leżą obok siebie w tym samym wierszu lub w tej samej kolumnie. Dwa sąsiednie piksele nazywamy kontrastującymi, jeśli ich wartości różnią się o więcej niż 128. Podaj liczbę wszystkich takich pikseli, dla których istnieje przynajmniej jeden kontrastujący z nim sąsiedni piksel.

Moim początkowym rozwiązaniem był kod:

obraz = []
ilosc = 0

with open("dane.txt", 'r') as file:
    for line in file:
        w = line.rstrip().split(" ")
        for i in w:
            obraz.append([int(i)])

for x in range(200):
    for y in range(320):
        if x > 0 and abs(obraz[x-1][y] - obraz[x][y]) > 128:
            ilosc += 1
        elif x < 199 and abs(obraz[x+1][y] - obraz[x][y]) > 128:
            ilosc += 1
        elif y > 0 and abs(obraz[x][y-1] - obraz[x][y]) > 128:
            ilosc += 1
        elif y < 319 and abs(obraz[x][y+1] - obraz[x][y]) > 128:
            ilosc += 1

print(ilosc)

Niestety okazał się on błędny, dopiero po chwili szperania w internecie natrafiłem na rozwiązanie, które różniło się w momencie pobierania danych do tworzonego "obrazu" i wyglądało następująco:

obraz = []
ilosc = 0

with open("dane.txt", 'r') as file:
    for line in file:
        w = line.rstrip().split(" ")
        obraz.append([int(i) for i in w])

for x in range(200):
    for y in range(320):
        if x > 0 and abs(obraz[x-1][y] - obraz[x][y]) > 128:
            ilosc += 1
        elif x < 199 and abs(obraz[x+1][y] - obraz[x][y]) > 128:
            ilosc += 1
        elif y > 0 and abs(obraz[x][y-1] - obraz[x][y]) > 128:
            ilosc += 1
        elif y < 319 and abs(obraz[x][y+1] - obraz[x][y]) > 128:
            ilosc += 1

print(ilosc)

Ten kod okazał się skuteczny.

Jak widać, oba kody różnią się umiejscowieniem drugiej pętli. Moje pytanie brzmi na czym polega ta różnica?

2 odpowiedzi

+3 głosów
odpowiedź 6 października 2023 przez adrian17 Ekspert (344,860 p.)

Patrzyłeś na to, co trafia do zmiennej 'obraz'? W jednym przypadku dla wejścia

1 2 3
4 5 6

dostajesz

[[1], [2], [3], [4], [5], [6]]

a w drugim

[[1, 2, 3], [4, 5, 6]]

W pierwszym kodzie masz

[int(i)]

więc z natury wszystkie listy są 1-elementowe.

1
komentarz 6 października 2023 przez wojtek_programista Nowicjusz (170 p.)
Dziękuję za szybką odpowiedź. Widzę w czym rzecz, jednak nie potrafię zrozumieć różnicy w działaniu obu przykładów. W pierwszym, dla każdego wyrazu 'i' w wierszu 'w' dodaje ten wyraz do 'obrazu' pojedynczo. Jednak jak to działa w przykładzie drugim? Do obrazu dodaję...? Właściwie co? Wiem, że każdy wiersz jako całość, ale na jakiej zasadzie to działa?
komentarz 6 października 2023 przez adrian17 Ekspert (344,860 p.)

W pierwszym, 320*200==64000 razy dodajesz appendem jednoelementową listę.

W drugim, 200 razy dodajesz appendem 320-elementową listę.

To:

obraz.append([int(i) for i in w])

Jak chcesz możesz zapisać jako

wiersz = []
for i in w:
    wiersz.append(int(w))
obraz.append(wiersz)

 

0 głosów
odpowiedź 6 października 2023 przez reaktywny Nałogowiec (41,050 p.)
Użyj:

obraz.extend([int(i) for i in w])

 

extend() zamiast append()
komentarz 6 października 2023 przez adrian17 Ekspert (344,860 p.)
Ale... to jest jeszcze gorsze. Czemu mówisz żeby zepsuć drugi - podobno działający - kod.
komentarz 7 października 2023 przez reaktywny Nałogowiec (41,050 p.)
Sorry, nie zapoznałem się z treścią zadania.

Podobne pytania

+1 głos
1 odpowiedź 180 wizyt
pytanie zadane 17 marca 2020 w Python przez wojtek_suchy Mądrala (6,880 p.)
0 głosów
3 odpowiedzi 320 wizyt
pytanie zadane 11 grudnia 2019 w Python przez Darven Użytkownik (860 p.)
0 głosów
1 odpowiedź 605 wizyt
pytanie zadane 10 maja 2020 w Python przez darb2000 Nowicjusz (120 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

61,966 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!

...