Llistes de llistes
Una llista normal (v = [1, 2, 3]) és una línia de caselles. Una matriu és, per sota, exactament això: una llista de llistes — files que al seu torn contenen columnes.
Declaració
m = [
[1, 2, 3],
[4, 5, 6]
]
Cada element de m és, al seu torn, una llista. m[0][0] val 1, m[1][2] val 6. A diferència de C, aquí no cal declarar cap mida: la llista ja sap quantes files i columnes té (len(m), len(m[0])).
Recórrer una matriu
Exemple
for fila in m:
for valor in fila:
print(valor, end=" ")
print()
Calen dos bucles niats: el de fora recorre les files, el de dins recorre els valors d'aquella fila. end=" " evita que print salti de línia després de cada valor; el print() buit, al final de cada fila, sí que hi salta.
Com a paràmetre d'una funció
Igual que amb una llista normal, una matriu no es copia quan es passa a una funció — i, a diferència de C, no cal declarar cap mida enlloc.
Exemple
def suma_matriu(m):
total = 0
for fila in m:
for valor in fila:
total = total + valor
return total
Compara-ho amb la versió de C: allà calia escriure int m[][COLUMNES], indicant sempre el nombre de columnes. Aquí suma_matriu(m) funcionaria igual de bé amb una matriu de 2×3 que amb una de 5×10 — la funció no necessita saber-ne la mida per endavant, perquè pot preguntar-ho ella mateixa amb len(fila) si li cal.
Mira la matriu recórrer's pas a pas
Fixa't en com el bucle de dins recorre tota una fila abans que el de fora passi a la següent.
Matrius
Codi
Variables
| Nom | Valor |
|---|
Matriu
Terminal
Problemes per resoldre
Sense solució ni comprovació automàtica: escriu el programa, executa'l (python3 programa.py) i prova'l amb els exemples. Les pistes són plegades perquè les obris només si les necessites.
1. Suma de cada fila
Donada una matriu de 3 files i 4 columnes amb valors escrits al codi, mostra la suma de cada fila, una per línia.
Fila 0: 10 Fila 1: 26 Fila 2: 42
Pistes
Pots fer servir enumerate(m) per obtenir alhora l'índex i la fila: for i, fila in enumerate(m):.
La suma d'una fila sencera la pots calcular amb un bucle, o directament amb sum(fila) (la funció sum() ja la coneixes).
2. El màxim d'una matriu
Escriu una funció maxim_matriu(m) que retorni el valor més gran de tota la matriu, sense fer servir max().
El màxim és: 9
Pistes
Comença suposant que el màxim és m[0][0], i recorre tota la matriu (els dos bucles niats) comparant cada element amb el candidat actual.
3. Matriu identitat
Construeix una matriu quadrada N×N (per exemple, 4×4) amb la matriu identitat: 1 a la diagonal principal (on la fila i la columna coincideixen) i 0 a la resta. Mostra-la.
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
Pistes
Pots construir cada fila amb un ternari dins d'una comprensió de llista: fila = [1 if i == j else 0 for j in range(n)], i anar afegint files a una llista buida amb append.
O, més senzill d'entendre: dos bucles for niats i, dins, m[i][j] = 1 if i == j else 0 sobre una matriu ja creada (per exemple, plena de zeros).
Exercicis d'autoavaluació
Aquests es generen amb valors nous a l'atzar i tenen solució comprovable.
Quina serà la sortida per terminal d'aquest programa?