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

python, out of range

Object Storage Arubacloud
+1 głos
212 wizyt
pytanie zadane 5 kwietnia 2022 w Python przez qwert 100 Obywatel (1,250 p.)

Cześć

Mam zsumować cyfry w tablicy dwuwymiarowej, ale tylko te, które nie znajdują się poniżej zera. Malutka przerwa od pisania i w sumie nie wiem co z tym dalej zrobić. Z góry dzięki za pomoc

a = [[0,1,1,2],[1,5,0,0],[2,0,3,3]]

sum = 0

for i in range(len(a)):
  for j in range(len(a[i])):
    if a[i][j] == 0:
      a[i+1][j] = 0
      
      sum += a[i][j]

      
    #print(matrix[i][j],end =" ")

  #print()
      
    
print(sum)
 

Wynikiem w kodzie powyżej ma być 9

komentarz 5 kwietnia 2022 przez Wiciorny Ekspert (270,190 p.)
generalnie nie wiem czy kod należy do Ciebie, bo biorąc pod uwagę czego oczekujesz od programu, to nie ralizujesz tej operacji w żadnym wypadku, jedynie sprawdzasz czu aktualny element nie jest zerem...  i przesuwasz indeks do 2 wiersza przypisujac mu na starcie wartosc 0

1 odpowiedź

+4 głosów
odpowiedź 5 kwietnia 2022 przez Wiciorny Ekspert (270,190 p.)
wybrane 6 kwietnia 2022 przez qwert 100
 
Najlepsza

Generalnie po pierwsze masz błąd: bo w sytuacji kiedy aktualna wartosc tablicy jest równa 0, to w tym wypadku przestawiasz się na następny element( będący w kolumnie, ale w następnym rekordzie) i ustawiassz mu na sztywno wartość 0.

 a[i+1][j] = 0 // przypisujesz zero 

To jest kod który zwróci: liczbę 18- czyli sume wszystkich liczb większych od zera.

a = [[0,1,1,2],[1,5,0,0],[2,0,3,3]]
 
sum = 0
 
for i in range(len(a)):
  for j in range(len(a[i])):
    if a[i][j] == 0:
     continue
    else:
      sum += a[i][j]
 
       
    #print(matrix[i][j],end =" ")
 
  #print()
       
     
print(sum)

Mam zsumować cyfry w tablicy dwuwymiarowej, ale tylko te, które nie znajdują się poniżej zera

Jak wynik dla tej 2-wymiarowej tablicy ma byc 9, skoro masz sumować liczby dodanie... :) a ich suma jest równa 18 ? 

Analizując sposób zadania, rozumiem że u chodzi o występowanie elementu pod narzędnym zerem w tej samej kolumnie?  Wtedy problemem jest fakt tego, że kiedy na ostatnim wierszu [2,0,3,3] wpada Ci wartość zero, nie istnieje wtedy następny wiersz 'i+1' gdyż ten jest ostatnim. 

Musisz dodac odpowiednie warunki sprawdzające aktualny stan 'iteratora' 

Pomysł na rozwiązanie z racji, że nie piszę w pythonie :D i serio cięzko mi z nim pracować miałem taki, że przechodząc przez aktualna tablice wszystkie zera ustawiam na -1 :) 
W wyniku otrzymam to czego nie liczę 

a = [[0,1,1,2],   
     [1,5,0,0],  
     [2,0,3,3]] 
 
sum = 0
 
for i in range(len(a)):
  for j in range(len(a[i])):
    
    if a[i][j] == 0 and i != len(a[i])-2:
       a[i][j]= -1
       a[i+1][j]=0
    else:
        if len(a[i])-2 == i:
            if a[i][j] == 0: 
                a[i][j]= -1
            else:
                continue
 
  #print()
       
     
print(a)
       
[[-1, 1, 1, 2], [-1, 5, -1, -1], [-1, -1, -1, -1]]

i teraz sumuje tam gdzie  wartości NIE  sa rowne  -1  [ wynikiem jest liczba 9 

nalezy miec na uwadze fakt, ze jesli nadzedny element jest 0, to zerujesz podrzędny co przekłada sie ze następny tez jest zerowany kaskadowo 

Rozwiązanie to tylko sugestia, daleka jest od 'super rozwiązania' gdyż ten język jest mi nieznany i pierwszy raz w nim wykonywałem działania, ciekawa sprawa, duża dowolność, sens jednak zachowany i pomysł jest. 
nadal jednak\ warto mieć na uwadzę wpływ nadrzędnika na kolumne 

komentarz 6 kwietnia 2022 przez dzihaaad Nowicjusz (220 p.)
Zaintrygowało mnie to rozwiązanie. Bardzo ciekawi mnie, skąd bierze się fakt zerowania elementów podrzędnych w Twoim rozwiązaniu ("kaskadowe zerowanie")? Jakieś algorytmy, programy , maszyny tak pracują? Generalnie skąd pomysł na to rozwiązanie ? Będę oczywiście dozgonnie wdzięczny za podzielenie się choćby skromnym wyjaśnieniem :)
komentarz 6 kwietnia 2022 przez qwert 100 Obywatel (1,250 p.)

@Wiciorny, Przepraszam, źle wytłumaczyłem, ale tak chodzi o element pod nadrzędnym "0" w tej samej kolumnie. Dziękuje za pomocwink

1
komentarz 6 kwietnia 2022 przez Wiciorny Ekspert (270,190 p.)

@dzihaaad, Już Ci tłumacze, to nie żaden algorytm specjalny, to jest logiczne myślenie generalnie oparte na tym iż to zadanie, jest sformułowaniem pewnego problemu MACIERZOWEGO kiedy  zerujemy elementy - powyżej diagonali lub poniżej dla odpowiednich przypadków 

Weź macierz dowolną : jest to jako tako dwuwymiarowa tabela gdzie mozemy wyznaczyc kolumny i wiersze. Idąc teraz tokiem myślenia: że każdy element nadrzędny który jest 0, powoduje że podrzędny element -> ma być traktowany jak zero czyli nieliczony.
I co w tym kaskadowego? 
Zauważ masz  1 kolumne i 5 rekordów -> wierszy idziesz od pierwszego, jeśli ten pierwszy jest zerem  to drugi bedzie zerem, no ale jeśli zerem jest drugi no to analogicznie ten trzeci poniżej musi być zerem. ( tzn musimy w aktualnym kroku go wyzerować, i tak postępujemy rekurncyjnie, kaskadowo) 
Stąd rekurencyjnie poczawszy od WIERSZA N ... każde nastęmne N+1 do  M - gdzie M jest ostatnim wierszem, będą zerowane 

1
komentarz 7 kwietnia 2022 przez dzihaaad Nowicjusz (220 p.)
@Wiciorny, Bardzo dziękuję za wytłumaczenie. Póki co na wiarę :) i na warsztat i do przerobienia. Wielkie dzięki!

Podobne pytania

+1 głos
1 odpowiedź 284 wizyt
0 głosów
1 odpowiedź 900 wizyt
pytanie zadane 6 czerwca 2019 w Python przez Ventre90 Obywatel (1,170 p.)
0 głosów
1 odpowiedź 1,554 wizyt
pytanie zadane 2 listopada 2019 w Python przez KitoPlayerPL Nowicjusz (150 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...