Anda di halaman 1dari 32

6 Informática (Teorı́a)

Python: Listas de Listas

Joaquim Gabarro
gabarro@cs.upc.edu

Computer Science
Universitat Politècnica de Catalunya
Matrices y listas de listas

Recorrido: sumar uno

Introducción a list comprehension

Ejemplo: suma de matrices

Función zip

Curiosidades
Matrices y listas de listas
Matrices y listas de listas

Sea la siguiente matriz 2 × 3 con 2 filas y 3 columnas


 
1 2 3
4 5 6

I M tiene 2 filas: (1, 2, 3), (4, 5, 6)


I y 3 columnas      
1 2 3
, ,
4 5 6
En Python la podemos codificar row like: lista de las filas:

M=[[1,2,3],[4,5,6]]
Acceder a los elementos de M

>>> M=[[1,2,3],[4,5,6]]
>>> M[0] #primera fila (es decir la zero)
[1, 2, 3]
>>> M[1] #segunda fila (es decir la uno)
[4, 5, 6]
>>> M[0][1] #de M[0]=[1,2,3] el segundo elemento
2
Rangos en M
Número de filas el número de columnas y rangos en M

>>> M=[[1,2,3],[4,5,6]]
>>> M
[[1, 2, 3], [4, 5, 6]]
>>> n_filas_M=len(M)
>>> n_filas_M
2
>>> n_columnas_M=len(M[0])
>>> n_columnas_M
3
>>> list(range(n_filas_M)) #para enumerar filas
[0, 1]
>>> list(range(n_columnas_M))
[0, 1, 2]
Añadir y extender una lista

I append(x). Add an item x to the end of the list.


I extend(L). Extend the list by appending all the items in the
given list L.
Indexación en Python

Usando la indexación que nos da Python notamos:

M = (mi,j ) = (m[i][j]))

Elı́ndice 0 ≤ i < 2 enumera las filas, el 0 ≤ j < 3 las columnas.

 
1 2 3
M =
4 5 6
   
m0,0 m0,1 m0,2 m[0][0] m[0][1] m[0][2]
= =
m1,0 m1,1 m1,2 m[1][0] m[1][1] m[1][2]
Recorrido: sumar uno
Ejemplo: sumar uno

Dada M = (mi,j ) contruir masUno = (mi,j + 1).


Dado:
 
1 2 3
M=
4 5 6

   
1+1 2+1 3+1 2 3 4
masUno(M) = =
4+1 5+1 6+1 5 6 7
Solución (I)

Ejemplo de esquema de recorrido por filas de M = (mi,j ).


Veamos como se enumeran las posiciones (i, j) de M

Dada M = (mi,j )
I Recorremos los valores de i que corresponden a los
ı́ndices de las filas de M.
I Para cada i, recorremos los distintos j que enumeran las
columnas .
Ejemplo:
 
m[0][0] m[0][1] m[0][2]
M=
m[1][0] m[1][1] m[1][2]

I Para i==0 el ı́ndice j toma los valores 0, 1, 2. Por lo


tanto, se enumeran (en este orden) las posiciones

(0,0) (0,1), (0,2)

Estas posiciones corresponden a la primera fila.


I Para i==1 el ı́ndice j toma los valores 0, 1, 2. Se
enumeran las posiciones

(1,0) (1,1), (1,2)

Estas posiciones corresponden a la segunda fila.


Vemos como, en el caso de masUno(M) se crea y llena la lista
resultado.

I Inicializar la matriz resultado masUno=[]


I Para cada fila i de M
I Inicializar la fila i-esima de masUno con fila=[]
I Iterar con j a traves de los elementos de la fila
i-esima añadiendo los mi,j + 1 mediante
fila.append(M[i][j]+1)
I Añadir a la lista masUno un nuevo item que es la fila entera
mediante masUno.append(fila)
I Retornamos masUno.
Solución (I)
Fichero mas uno.py

def mas_uno(M):
n_filas = len(M)
n_columnas = len(M[0])
masUno = []
# iterar a traves de las filas de M
for i in range(n_filas):
#inicialimos fila i-esima
fila = []
# iterar a traves de las columnas de M
for j in range(n_columnas):
fila.append(M[i][j] + 1)
masUno.append(fila)
return masUno
Ejemplo de ejecución:

>>> M= [[4, 3, 9], [5, 0, 2]]


>>> mas_uno(M)
[[5, 4, 10], [6, 1, 3]]
>>> M #el valor inicial de M no se ha modificado
[[4, 3, 9], [5, 0, 2]]
>>>
Comentario sobre masUno.append(fila)
I Inicialmente masUno=[]
I Con i==0, y tras la primera iteracion de j tenemosfila
=[5, 4, 10]
I En masUno.append(fila) añadimos a masUno un solo
item formado for la sublista [5, 4, 10]. Tras el append
masUno= [[5, 4, 10]]
I Con i==1 añadimos el otro item [6, 1, 3]
I Finalmente masUno=[[5, 4, 10], [6, 1, 3]]
Solución (tentativa) II

Recordemos M=[[4, 3, 2], [5, 0, 2]


Idea: Iteramos directamente sobre las filas de M (no sobre el i
que las enumera). Fichero mas uno reescribe matriz.py

def mas_uno(M):
n_columnas = len(M[0])
for fila in M:
for j in range(n_columnas):
fila[j]=fila[j] + 1
return M

fila toma los valores [4, 3 ,9] y [5, 0, 2]


Problema: modifica el parámetro M, veamoslo en un ejemplo.
Modifica la matriz M

>>> M=[[4,3,9],[5,0,2]]
>>> M
[[4, 3, 9], [5, 0, 2]]
>>> mas_uno(M)
[[5, 4, 10], [6, 1, 3]]
>>> M
[[5, 4, 10], [6, 1, 3]]
>>>

Queremos modificar el programa de manera que M no se


modifique.
Solución (II)
Introducimos new file que inicializamos mediante extend
con la fila de M que se esta tratando:

new file.extend(fila)

Fichero mas uno matriz.py:

def mas_uno(M):
n_columnas = len(M[0])
masUno=[]
for fila in M:
new_file=[]
new_file.extend(fila)
for j in range(n_columnas):
new_file[j]=new_file[j] + 1
masUno.append(new_file)
return masUno
Introducción a list comprehension
Solución (III)
Veamos otra codificación parecida a a ls solución II (fihero
mas uno matriz.py):
I El primer for sobre las filas se puede reescribir

masUno = [ .... for fila in M]

I Añadimos el segundo for substituendo los ... por

[fila[j]+1 for j in range(n columnas)]

Fichero mas uno comprehension.py


def mas_uno(M):
n_columnas = len(M[0])
masUno = [[fila[j]+1 for j in range(n_columnas)] for fila in M]
return masUno
List comprehensions provide a concise way to create lists.
https://docs.python.org/3/tutorial/datastructures.html#
list-comprehensions
El programa (my squares append.py)

def my_squares():
squares = []
for x in range(10):
squares.append(x**2)
return squares

se reescribe (my squares listcomp.py):

def my_squares():
squares = [x**2 for x in range(10)]
return squares
Ejemplo: suma de matrices
Suma de matrices

Dadas A = (ai,j ) y B = (bi,j ) la suma Suma = A + B se define


como Suma = (sumai,j ) con sumai,j = ai,j + bi,j para todo
i, j. Ejemplo:
     
1 4 0 4 3 9 5 7 9
+ =
3 7 1 5 0 2 8 7 3
Veamos los ı́ndices:
   
a[0][0] a[0][1] a[0][2] b[0][0] b[0][1] b[0][2]
+
a[1][0] a[1][1] a[1][2] b[1][0] b[1][1] b[1][2]
 
suma[0][0] = a[0][0] + b[0][0] suma[0][1] suma[0][2]
=
suma[1][0] suma[1][1] suma[1][2]

En general suma[i][j]=a[i][j]+b[i][j]
Solución (I)

Sigue las lineas de la solución (I) de sumar uno (fichero


mas uno-py. La siguiente solución se encuentra en el fichero
suma matrices.py

def suma_matrices(A, B):


n_filas = len(A) # igual len(B)
n_columnas = len(A[0]) # igual a len(B[0])
suma = []
for i in range(n_filas):
fila = []
for j in range(n_columnas):
fila.append(A[i][j] +B[i][j])
suma.append(fila)
return suma
Solución (II)

Creamos inicialmente la matriz Suma llenandola de zeros.


Inspirado en C++, fichero suma matrices con matriz.py
def matriz_zeros(n_filas, n_columnas):
zeros = [[0 for col in range(n_columnas)] for row in range(n_filas)]
return zeros

def suma_matrices(A, B):


n_filas = len(A) # igual len(B)
n_columnas = len(A[0]) # igual a len(B[0])
suma = matriz_zeros(n_filas, n_columnas)
for i in range(n_filas):
for j in range(n_columnas):
suma[i][j] =A[i][j]+B[i][j]
return suma
Función zip
La función zip (cremallera)

This function takes two equal-length collections, and merges


them together in pairs. If we use this on our list of values, we
get the following:

>>> fila_A=[1, 4, 0]
>>> fila_A
[1, 4, 0]
>>> fila_B=[4, 3, 9]
>>> fila_B
[4, 3, 9]
>>> list(zip(fila_A, fila_B))
[(1, 4), (4, 3), (0, 9)]
También podemos hacer el zip con matrices:

>>> A=[[1,4,0],[3,7,1]]
>>> B=[[4,3,9],[5,0,2]]
>>> list(zip(A, B))
[([1, 4, 0], [4, 3, 9]), ([3, 7, 1], [5, 0, 2])]
Suma de matrices (con zip)

Fichero suma matrices zip.py


def suma_matrices(A, B):
’’’
>>> suma_matrices([[1,4,0],[3,7,1]],[[4,3,9],[5,0,2]])
[[5, 7, 9], [8, 7, 3]]
’’’
C = []
for fila_A, fila_B in zip(A, B):
fila_C = []
for a, b in zip(fila_A, fila_B):
fila_C.append(a + b)
C.append(fila_C)
return C
if __name__ == "__main__":
print(suma_matrices([[1,4,0],[3,7,1]],[[4,3,9],[5,0,2]]))
import doctest
doctest.testmod()
Curiosidades
Pausa: Curiosidades (generales) relacionadas con la
ingenierı́a y el zip

I Quién invento la cremallera de la ropa (no la de Python)?


Gideon Sundbäck (1880 - 1954) fue un inventor sueco que
logró diversos avances en el desarrollo de la cremallera
entre 1906 y 1914.
https://es.wikipedia.org/wiki/Gideon_Sundb%
C3%A4ck
I Quien invento el .zip? Phillip Walter Katz (1962 – 2000).
Tuvo una vida atormentada.
https://es.wikipedia.org/wiki/Phil_Katz

Anda mungkin juga menyukai