# llistes de llistes

Matrius en Python

Llistes de llistes: com es declaren, com es recorren, i per què aquí no hi ha cap parany en passar-les a una funció — a diferència de C.

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

NomValor

Matriu

Terminal

Pas 1 / 1

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?