• 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
122 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 (346,320 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 (346,320 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,110 p.)
Użyj:

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

 

extend() zamiast append()
komentarz 6 października 2023 przez adrian17 Ekspert (346,320 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,110 p.)
Sorry, nie zapoznałem się z treścią zadania.

Podobne pytania

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

92,687 zapytań

141,599 odpowiedzi

320,089 komentarzy

62,048 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

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!

...