Riferimenti: SoftPython - matrice di liste 1
Esc
Summer School Data Science 2023 - Modulo 1 informatica: Moodle
Docente: David Leoni david.leoni@unitn.it
Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it
|
|
|
Ci sono sostanzialmente due modi in Python di rappresentare matrici:
Liste di liste:
Numpy (più avanti):
m = [
['a','b'],
['c','d'],
['a','e']
]
Assumiamo matrici con:
m = [
['v','e','r','d','e'],
['r','o','s','s','o'],
['v','i','o','l','a'],
]
m[0]
['v', 'e', 'r', 'd', 'e']
m[1]
['r', 'o', 's', 's', 'o']
m = [
['v','e','r','d','e'],
['r','o','s','s','o'],
['v','i','o','l','a'],
]
m[0][0]
'v'
m[0][1]
'e'
ATTENZIONE: Quando una matrice è una lista di liste, puoi solo accedere valori con notazione m[i][j]
, NON con m[i,j]
!!
m = [
['v','e','r','d','e'],
['r','o','s','s','o'],
['v','i','o','l','a'],
]
len(m) # righe
3
len(m[0]) # colonne
5
for
in
¶
for
in
range
¶
✪ Implementa Risolvi come preferisci. Soluzioni possibili: |
def esriga(mat, i):
raise Exception("TODO IMPLEMENT ME!")
m = [ ['a','b'],
['c','d'],
['a','e'] ]
assert esriga(m, 0) == ['a','b']
assert esriga(m, 1) == ['c','d']
assert esriga(m, 2) == ['a','e']
# controlla che la riga estratta sia NUOVA
r = esriga(m, 0)
r[0] = 'z'
assert m[0][0] == 'a'
print("Test passati!")
|
✪ RITORNA la DOMANDA: in questo caso, sarebbe possibile un puntatore a una regione di memoria esistente? Soluzioni possibili: |
def escol(mat, j):
raise Exception('TODO IMPLEMENT ME !')
# TEST
m = [
['a','b'],
['c','d'],
['a','e'],
]
assert escol(m, 0) == ['a','c','a']
assert escol(m, 1) == ['b','d','e']
# Controlla che la colonna estratta sia NUOVA
c = escol(m,0)
c[0] = 'z'
assert m[0][0] == 'a'
print("TEST PASSATI!")
|
Ci sono diversi modi di creare una nuova matrice 3x5 vuota come lista di liste che contengono degli zero.
Esempio con due cicli for
annidati
def matrice_vuota(n, m):
ret = []
for i in range(n):
riga = []
ret.append(riga)
for j in range(m):
riga.append(0)
return ret
matrice_vuota(3,5)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Lista di 3 elementi tramite replicazione:
[0]*3
[0, 0, 0]
NON creare matrici vuote così:
Come produrre un clone completo di una matrice (deep clone)?
DOMANDA: questo codice funziona?
def deep_clone(mat):
return mat[:]
def deep_clone(mat): # corretto
ret = []
for riga in mat:
ret.append(riga[:])
return ret
DOMANDA: altri modi?
Esercizio - riempic¶✪✪ Implementa la funzione Domanda: cosa possiamo usare? a) for in b) for in range c) slice d) list comprehension |
def riempic(mat, c):
raise Exception('TODO IMPLEMENT ME !')
m1 = [ ['a'] ]
riempic(m1,'z')
assert m1 == [ ['z'] ]
m2 = [ ['a'] ]
riempic(m2,'y')
assert m2 == [ ['y'] ]
# j 0 1
m3 = [ ['a','b'], # 0
['c','d'], # 1
['e','f'] ] # 2
riempic(m3, 'x')
assert m3 == [ ['x','x'],
['x','x'],
['x','x'] ]
|
Nelle slide ho messo solo esempi dei casi principali
Su SoftPython - matrici liste di liste 1 trovate discussione e soluzioni di vari casi: