Listas por comprensión

abril 03, 2015



Mé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
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]:
[0, 1, 4, 9, 16]
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]:
['mi variable-python', 'mi variable-math', 'mi variable-Colombia']

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]:
[45, 65]
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]:
[0.45, 0.65]
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]:
['PERRO', 'otag', 'PÁJARO', 'ollabac', 'ecnil']

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)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
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]:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

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]:
['Rosa', 'Emma', 'Marie']

You Might Also Like

0 comments

Apoyado por: