Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Comprendere bene le matrici

M
MatteoB (1690 points)
10 16 21
in Programmare in Python by (1.7k points)

Ciao a tutti!

Io ho un pò di problemi nel capire bene le matrici, cioè la matrice bidimensionale più o meno l'ho capita.

Da un pò di tempo mi sto cimentando a provare a scorrere gli elementi dentro ad una matrice rettangolare, ma continuo ad andare fuori range

Come posso fare?

La mia idea è scorrere questa matrice per colonne facendo due for annidati

lista = [ ['ciao','pippo','pluto'] , ['topolino','paperino','zio'] ]

for row in range(len(lista))

     for col in range(len(lista[col][row])

319 views

3 Answers

AdSum (16290 points)
9 20 134
by (16.3k points)

Buonasera in questo codice

lista = [ ['ciao','pippo','pluto'] , ['topolino','paperino','zio'] ]

for row in range(len(lista))

     for col in range(len(lista[col][row])

l'errore è situato nella terza riga, ovvero

   for col in range(len(lista[col][row])

per il semplice motivo che alla variabile "col" non hai ancora assegnato un valore, e perciò è impossibile andare a prendere l'elemento all'indice row (None non è un indice valido)

Per quanto riguarda il ragionamento sembra che tu non abbia ben compreso il funzionamento delle liste multidimenzionali. Una lista multidimenzionale non è altro che una lista che contiene altre liste. E ogni lista va trattata nella stessa maniera.

Prendiamo il tuo esempio:

lista = [ ['ciao','pippo','pluto'] , ['topolino','paperino','zio'] ]

Andando a fare len(lista) si otterrà 2, in quanto contiene  ['ciao','pippo','pluto'] e ['topolino','paperino','zio'].

Andando a fare lista[0] si otterrà ['ciao','pippo','pluto'], con lista [1] si otterrà ['topolino','paperino','zio'].
Ora queste sono delle altre semplicissime liste, e quindi validi parametri per la funzione len().

Quindi, se volessi andare a prendere la lunghezza della lista ['ciao','pippo','pluto']  mi basterebbe fare len(lista[0]). Infatti:

len(lista[0])

len( ['ciao','pippo','pluto'])

3

Spero di essere stato abbastanza chiaro, per ogni dubbio non esitare a chiedere :)

EDIT:

Rileggendo bene mi sono scordato di spiegare il perchè del fuori range!

Prendiamo il tuo caso:

lista = [ ['ciao','pippo','pluto'] , ['topolino','paperino','zio'] ]

for row in range(len(lista))

     for col in range(len(lista[col][row])

 cosa fa la terza riga in particolare? Andiamolo ad esaminare:

col=0 #prendo questi valori come esempio

row=0

len(lista[col][row])

len(lista[0][0])

len("ciao")   #ciao è una stringa, e in quanto tale è una lista di caratteri

4

len("ciao")>len(lista[0])

 Ecco spiegato l'errore!

M
MatteoB (1690 points)
10 16 21
by (1.7k points)

Si quel passaggio sul secondo for è stato un mia sfuggita, tant'è che sul codice avevo scritto in maniera giusta...

Ma continua a sfuggirmi sempre qualcosa (sarò stupido io)

fatti i due cicli uno che mi scorre la riga e l'altro che mi scorre per la lunghezza di quella specifica riga giusto?

io mi sono fatto anche una sorta di tabella ma a quando provo a fare il debug il risultato non è quello che mi aspetto, Mi spiego meglio:

row\col 0 1 2
0 ciao pippo pluto
1 topolino paperino zio

partendo con la prima stampa, quindi col[0]row[0] = ciao e questo mi sembra giusto

ma alla seconda volta, quindi col[1]row[0] = topolino  non dovrebbe darmi quando col[0]row[1] ?

AdSum (16290 points)
9 20 134
by (16.3k points)
edited by

Aspetta, ho capito dove ti stai incartando. Prendiamo la tua tabella:

0 1 2
0 ciao pippo pluto
1 topolino paperino zio

Tu ti stai incartando perchè ti stai rappresendando male le tabelle rispetto a come hai impostato i for.

La tua tabella più corretta sarebbe:

col   \       row --> 0                               1                           
0 ciao topolino
1 pippo paperino
2 pluto zio

 Perchè se:

for row in range(len(lista))

     for col in range(len(lista[row]))

Tu vedi che con:

for row in range(len(lista))

stai scorrendo le varie liste (e quindi ogni lista va inserita in maniera verticale, non orizzontale) e con:

 for col in range(len(lista[row])

stai scorrendo i vari valori(e quindi stai "scendendo nella tua lista prendendo tutti i vari valori.

Per rendere "giusta" la tua tabella vanno invertiti, quindi:

for col in range(len(lista))

     for row in range(len(lista[col])

fatto sta che non c'è un modo corretto o errato, dipende solamente dalla maniera con la quale sei piu comodo.

M
MatteoB (1690 points)
10 16 21
by (1.7k points)

io volevo prenderli in colonna gli elementi ed ora ho fatto

for row in range(len(lista[row]))

    for col in range(len(lista))

e nella stampa a debug riuscivo a stamparli come volevo io (cioè nella tabella che ti ho indicato io)... Però se mando in test mi da questo errore IndexError: list index out of range perchè mi voglio far riportare una lista di parole

AdSum (16290 points)
9 20 134
by (16.3k points)
Apparte che stai nuovamente utilizzando row come indice quando ancora non è instanziato, ma suppongo sia un errore di battitura, anche perchè altrimenti ti avrebbe dato tutt'altro problema. Qui i for non vanno bene, i for annidati devono andare a prendere le lunghezze dall'esterno verso l'interno. quindi prima len(lista) e poi len(lista[row]) altrimenti il programma non funziona!
M
MatteoB (1690 points)
10 16 21
by (1.7k points)
edited by

ok ho provato come dici tu ma mi list index out of range mi stampa:

ciao

topolino 

IndexError

non so più che fare angry

gusgus (1730 points)
5 8 31
by (1.7k points)

Buonasera,

per capire meglio visualizzala in questo modo:

x 0 1 2
0 ciao pippo pluto
1 topolino paperino zio

 

per scorrere a colonne (immaginando che sia questa la rappresentazione) dovrai settare il primo for per scorrere le righe, il secondo for annidato invece dovrà scorrere le colonne con una scrittura più o meno di questo tipo:
per i nella lista:
   per j nella lista di i:
       #quello che devi fare
spero questo aiuti


 

andrea.sterbini (207880 points)
745 1264 2372
by (208k points)
No code please
R
Raffaele (3850 points)
15 27 49
by (3.9k points)
Se hai una lista di 4 elementi e fai

For i in range(100):

         Print(lista[i])

Ottieni un index error

Gestibile tramite una eccezione, con la sintassi try except.

           Try:
                     Print(Iista[i] )
          Except IndexError:
                    Continue