Listas por comprensión
abril 03, 2015Método conciso de construcción de listas a partir de bucles y/o condicionales evitando el uso de funciones como map() y filter(). Su implementación se describe en la guía PEP 202
Creado: Abril 3 de 2015
Modificado: Noviembre 11 de 2018
Testeado en Python 3.6.4
Modificado: Noviembre 11 de 2018
Testeado en Python 3.6.4
Se crea una lista con el cuadrado de los números del 0 al 5:
In [1]:
[x**2 for x in range(5)]
Out[1]:
Crear listas como resultado de operaciones con otra lista:
In [7]:
list_str = ['python', 'math', 'Colombia']
['mi variable-'+x for x in list_str]
Out[7]:
Condicionales¶
Una manera concreta de filtrar elementos de una lista es utilizando el método de comprensión con un condicional. Dada una lista tomemos solo los valores mayores a 40
In [19]:
list_ref = [38, 45, 32, 65, 12]
[x for x in list_ref if x > 40]
Out[19]:
También es posible realizar una operación al tiempo que se realice el filtro, por jemplo si se requieren los números mayores a 40 divididos por 100
In [20]:
[x/100 for x in list_ref if x > 40]
Out[20]:
De igual manera se puede implementar un condicional con diferentes acciones dependiendo si cumple o no la condición. Tomando una lista de nombres de animales se convertiran en mayúscula si comienzan por p y se escribe al revés el nombre en caso contrario:
In [15]:
animales = ['perro', 'gato', 'pájaro', 'caballo', 'lince']
[a.upper() if a.startswith('p') else a[::-1] for a in animales]
Out[15]:
Bucles anidados¶
Para la creación de listas que requiera de mas de un bucle es posible anidarlos, veamos la creación de una lista mediate el método append() y el uso de dos for anidados:
In [23]:
mult_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
nueva_lista = []
for lista_int in mult_list:
for elemento in lista_int:
nueva_lista.append(elemento)
print(nueva_lista)
Ahora, si se construye la lista por comprensión equivale a:
In [24]:
[elemento for lista_int in mult_list for elemento in lista_int]
Out[24]:
Bucles anidados y condicionales¶
Se tiene la base de datos dispuesta en listas, en donde cada lista equivale a un salón de clase y se requiere obtener los nombres de los estudiantes cuyos nombres no superen las 5 letras
In [27]:
colegio = [['Andrés', 'Camilo', 'Rosa', 'Alfred'],
['Lucian', 'Raskolnikov', 'Emma', 'Marie'],
['Mozart', 'Chopin', 'Albert']]
[nombre for salon in colegio for nombre in salon if len(nombre) <= 5]
Out[27]:
0 comments