Encuentro9 Sincronico

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 30

Programación I

Encuentro 9 Sincrónico
Prof. Guillermo Oliva
Listas dentro de listas

Las listas pueden constar de escalares (es decir, números) y elementos


de una estructura mucho más compleja (ya has visto ejemplos como
cadenas, booleanos o incluso otras listas en las lecciones anteriores).
Veamos más de cerca el caso en el que los elementos de una lista son
solo listas.
A menudo encontramos estos arreglos en nuestras vidas.
Probablemente el mejor ejemplo de esto sea un tablero de ajedrez.
Un tablero de ajedrez está compuesto de filas y columnas. Hay ocho filas
y ocho columnas. Cada columna está marcada con las letras de la A a la
H. Cada línea está marcada con un número del uno al ocho.
Listas dentro de listas

La ubicación de cada campo se identifica por pares de letras y dígitos. Por lo


tanto, sabemos que la esquina inferior derecha del tablero (la que tiene la
torre blanca) es A1, mientras que la esquina opuesta es H8.
Supongamos que podemos usar los números seleccionados para representar
cualquier pieza de ajedrez. También podemos asumir que cada fila en el
tablero de ajedrez es una lista.
Observa el siguiente código:
fila = []
for i in range(8):
row.append(PEON_BLANCO)
Listas dentro de listas

Crea una lista que contiene ocho elementos que representan la segunda fila del
tablero de ajedrez: la que está llena de peones (supon que PEON_BLANCO es un
símbolo predefinido que representa un peón blanco).

El mismo efecto se puede lograr mediante una comprensión de lista, la sintaxis


especial utilizada por Python para completar o llenar listas masivas.
Una comprensión de lista es en realidad una lista, pero se creó sobre la marcha
durante la ejecución del programa, y no se describe de forma estática.
Listas dentro de listas

Echa un vistazo al fragmento:


fila = [PEON_BLANCO for i in range(8)]

La parte del código colocada dentro de los paréntesis especifica:


• Los datos que se utilizarán para completar la lista (PEON_BLANCO)
• La cláusula que especifica cuántas veces se producen los datos dentro de la lista
(for i in range(8))
Listas dentro de listas

Te muestro otros ejemplos de comprensión de lista:


Ejemplo # 1:
cuadrados = [x ** 2 for x in range(10)]

El fragmento de código genera una lista de diez elementos y rellena con


cuadrados de diez números enteros que comienzan desde cero (0, 1, 4, 9,
16, 25, 36, 49, 64, 81)
Ahora prueben en IDLE de Python ……
Listas dentro de listas

Ejemplo # 2:
dos = [2 ** i for i in range(8)]

El fragmento crea un arreglo de ocho elementos que contiene las primeras


ocho potencias del numero dos (1, 2, 4, 8, 16, 32, 64, 128)
Se dieron cuenta de la diferencia con el primer ejemplo?
Listas dentro de listas

Ejemplo # 3:
probabilidades = [x for x in cuadrados if x % 2 != 0]

El fragmento hace una lista con solo los elementos impares de la


lista cuadrados
Listas dentro de listas: arreglos bidimensionales
Supongamos también que un símbolo predefinido denominado EMPTY designa un campo vacío en
tablero de ajedrez.
Entonces, si queremos crear una lista de listas que representan todo el tablero de ajedrez, se puede hace
de la siguiente manera:
tablero = []
for i in range(8):
fila = [EMPTY for i in range(8)]
tablero.append(fila)

Nota:

• La parte interior del bucle crea una fila que consta de ocho elementos(cada uno de ellos es igual a EMPTY) y lo agrega a la lista
del tablero.

• La parte exterior se repite ocho veces.

• En total, la lista tablero consta de 64 elementos (todos iguales a EMPTY).


Listas dentro de listas

Este modelo imita perfectamente el tablero de ajedrez real, que en


realidad es una lista de elementos de ocho elementos, todos ellos en filas
individuales. Resumamos nuestras observaciones:
• Los elementos de las filas son campos, ocho de ellos por fila.
• Los elementos del tablero de ajedrez son filas, ocho de ellos por
tablero de ajedrez.
La variable tablero ahora es un arreglo bidimensional. También se le
llama, por analogía a los términos algebraicos, una matriz.
Listas dentro de listas

Como las listas de comprensión puede ser anidadas, podemos acortar la


creación del tablero de la siguiente manera:
tablero = [[EMPTY for i in range(8)] for j in range(8)]

La parte interna crea una fila, y la parte externa crea una lista de filas.
Listas dentro de listas: arreglos bidimensionales - continuación

El acceso al campo seleccionado del tablero requiere dos índices: el primero


selecciona la fila; el segundo: el número del campo dentro de la fila, el cual es
un número de columna.

Echa un vistazo al tablero de ajedrez. Cada campo contiene un par de índices


que se deben dar para acceder al contenido del campo:
Listas dentro de listas: arreglos bidimensionales - continuación
Listas dentro de listas: arreglos bidimensionales - continuación
Echando un vistazo a la figura que se muestra arriba, coloquemos algunas piezas de ajedrez en el tablero.
Primero, agreguemos todas las torres:
tablero[0][0] = TORRE
tablero[0][7] = TORRE
tablero[7][0] = TORRE
tablero[7][7] = TORRE
Si deseas agregar un caballo a C4, hazlo de la siguiente manera:
tablero[4][2] = CABALLO
Y ahora un peón a E5:
tablero[3][4] = PEON
Y ahora - experimenta con el código en el editor.
Listas dentro de listas
Naturaleza multidimensional de las listas: aplicaciones avanzadas

Profundicemos en la naturaleza multidimensional de las listas. Para encontrar cualquier


elemento de una lista bidimensional, debes usar dos coordenadas:
• Una vertical (número de fila).
• Una horizontal (número de columna).
Imagina que desarrollas una pieza de software para una estación meteorológica
automática. El dispositivo registra la temperatura del aire cada hora y lo hace durante
todo el mes. Esto te da un total de 24 × 31 = 744 valores. Intentemos diseñar una lista
capaz de almacenar todos estos resultados.
Primero, debes decidir qué tipo de datos sería adecuado para esta aplicación. En este
caso, sería mejor un float, ya que este termómetro puede medir la temperatura con
una precisión de 0.1 ℃.
Naturaleza multidimensional de las listas: aplicaciones avanzadas

Luego tomarás la decisión arbitraria de que las filas registrarán las


lecturas cada hora exactamente (por lo que la fila tendrá 24 elementos) y
cada una de las filas se asignará a un día del mes (supongamos que cada
mes tiene 31 días, por lo que necesita 31 filas). Aquí está el par apropiado
de comprensiones(h es para las horas, dpara el día):
temps = [[0.0 for h in range (24)] for d in range (31)]

Toda la matriz está llena de ceros ahora. Puede suponer que se actualiza
automáticamente utilizando agentes de hardware especiales. Lo que
tienes que hacer es esperar a que la matriz se llene con las mediciones.
Naturaleza multidimensional de las listas: aplicaciones avanzadas

Ahora es el momento de determinar la temperatura promedio mensual del mediodía. Suma las
31 lecturas registradas al mediodía y divida la suma por 31. Puedes suponer que la
temperatura de medianoche se almacena primero. Aquí está el código:

Nota: La variable day utilizada


por el bucle for no es un
escalar: cada paso a través de
la matriz temps lo asigna a la
siguiente fila de la matriz; Por lo
tanto, es una lista. Se debe
indexar con 11 para acceder al
valor de temperatura medida al
mediodía.
Naturaleza multidimensional de las listas: aplicaciones avanzadas
Ahora encuentra la
temperatura más alta durante
todo el mes: -----→

Nota:

La variable day itera en todas las filas


de la matriz temps.

La variable temp itera a través de


todas las mediciones tomadas en un
día.
Naturaleza multidimensional de las listas: aplicaciones avanzadas

Ahora cuenta los días en que la


temperatura al mediodía fue de al
menos 20 ℃:
Arreglos tridimensionales

Python no limita la profundidad de la inclusión lista en lista. Aquí puedes ver un


ejemplo de un arreglo tridimensional:
Imagina un hotel. Es un hotel enorme que consta de tres edificios, de 15 pisos cada
uno. Hay 20 habitaciones en cada piso. Para esto, necesitas un arreglo que pueda
recopilar y procesar información sobre las habitaciones ocupadas/libres.
Primer paso: El tipo de elementos del arreglo. En este caso, sería un valor booleano
(True/False).
Paso dos: Análisis de la situación. Resume la información disponible: tres edificios, 15
pisos, 20 habitaciones.
Arreglos tridimensionales

Ahora puedes crear el arreglo:


habitaciones = [[[False for r in range(20)] for f in range(15)]
for t in range(3)]

El primer índice (0 a 2) selecciona uno de los edificios; el segundo(0 a 14) selecciona


el piso, el tercero (0 a 19) selecciona el número de habitación. Todas las habitaciones
están inicialmente desocupadas.
Arreglos tridimensionales

Ahora ya puedes reservar una habitación para dos recién casados: en el segundo
edificio, en el décimo piso, habitación 14:
habitaciones[1][9][13] = True

y desocupa el segundo cuarto en el quinto piso ubicado en el primer edificio:


habitaciones[0][4][1] = False
Arreglos tridimensionales

Verifica si hay
disponibilidad en el
piso 15 del tercer
edificio:

La variable vacante
contiene 0 si todas las
habitaciones están
ocupadas, o en dado caso
el número de
habitaciones
disponibles.
Puntos clave

1. La comprensión de listas te permite crear nuevas listas a partir de las existentes


de una manera concisa y elegante. La sintaxis de una lista de comprensión es la
siguiente:
[expresión for elemento in lista if condicional]

El cual es un equivalente del siguiente código:


for elemento in lista:

if condicional:

expresión

Este es un ejemplo de una lista de comprensión: el código siguiente crea una lista de
cinco elementos con los primeros cinco números naturales elevados a la potencia de 3:
cubos = [num ** 3 for num in range (5)]

print(cubos) # salidas: [0, 1, 8, 27, 64]


Puntos Clave

2. Puedes usar listas anidadas en Python para crear matrices (es decir, listas
bidimensionales). Por ejemplo:
Puntos Clave
Puntos Clave

3. Puedes anidar tantas listas en las listas como desee y, por lo tanto, crear listas n-
dimensionales, por ejemplo, arreglos de tres, cuatro o incluso sesenta y cuatro
dimensiones. Por ejemplo:
Puntos Clave
Programación I
Encuentro 9 Sincrónico
Prof. Guillermo Oliva

También podría gustarte