Comprension de listas

# Hemos visto en muchos ejercicios que recorrer y procesar una lista es habitual
# En python tenemos la comprension de listas
# [expresión for elemento in iterable]

cuadrados = [x ** 2 for x in range(1, 10)]
print(cuadrados)

# Hace exactamente lo mismo que esto
cuadrados = []
for x in range(1, 10):
    cuadrados.append(x ** 2)

letrasdobles = [letra * 2 for letra in "hola que tal"]
print(letrasdobles)

notas = [4, 15, 7, 19, 12]
notas10 = [nota / 2 for nota in notas]
print(notas10)

notascopia = [nota for nota in notas]
print(notascopia)

# tabla de multiplicar del 7 (7,14,21,...,70)

tabla7 = [x * 7 for x in range(1, 11)]
print(tabla7)

# Añadir una condición: seleccionar lo elementos del iterable que cumplan una determinada condición
# [expresion for elementi in interable if condicion]

# Buscamos los que sean pares (x%2==0)
pares = [x for x in range(1, 11) if x % 2 == 0]
print(pares)

# Las cadenas de una determinada longitud
cadenas = ["a", "bb", "ccc", "dddd", "eeeeee", "fffffff"]
largas = [cadena for cadena in cadenas if len(cadena) > 4]
print(largas)

# Buscamos las notas aprobadas (>10) y además las transformamos
notas10aprobadas = [nota / 2 for nota in notas if nota >= 10]
print(notas10aprobadas)

# Operador ternario: Igual que un if pero en vez de controlar el flujo
# devuelve un valor dependiendo de la condicion
# valor_si_cierto if condicion else valor_si_falso

numero = 27

espar = "par" if numero % 2 == 0 else "impar"

print(espar)

if numero % 2 == 0:
    espar = "par"
else:
    espar = "impar"

ciudad = "Logroño"
envio = 5 if ciudad == "Barcelona" else 10
print(envio)  # 10


def calculoEnvio(ciudad):
    return 5 if ciudad == "Barcelona" else 10


print(calculoEnvio("Barcelona"))  # 5

# Podemos usar como expresión un operador ternario

notasCorte = ["Aprobada" if nota >= 10 else "Suspendida" for nota in notas]
print(notasCorte)

longitudes = ["corta" if len(cadena) < 4 else "larga" for cadena in cadenas]
print(longitudes)

# Todo junto

numeros = [1, 4, -5, 7, -2, 20]
# A los números positivos si es par lo duplicamos y si es impar lo elevamos al cuadrado

calculo = [numero * 2 if numero % 2 == 0 else numero ** 2 for numero in numeros if numero >= 0]
print(calculo)

# nucleo que es recorer una lista
# for elemento in iterable: for numero in numeros
# Parte derecha yo puedo poner una condición: ejemplo if numero>=0 (los positivos) [1,4,7,20]
# parte izquierda pongo una expresión puede ser numero en cuyo caso no hacemos ninguna transformación
calculo = [numero for numero in numeros if numero >= 0]
print(calculo)
# Una expresión sencilla, por ejemplo, elevar al cubo
calculo = [numero ** 3 for numero in numeros if numero >= 0]
print(calculo)

# Liarme la manta a la cabeza y usar un operador ternario, en este caso
# si es par duplicamos, si es impar elevamos al cubo
# en el operador ternario hacemos lo mismo, empezamos por el núcleo, la condición
# if numero%2==0
# en la parte derecha ponemos lo que devolvemos si NO se cumple la condición numero**2
# en la parte izquierda ponemos lo que devolvemos si SÍ se cumple numero*2
# numero * 2 if numero % 2 == 0 else numero ** 2
# Juntando todo obtengo lo siguiente:
calculo = [numero * 2 if numero % 2 == 0 else numero ** 2 for numero in numeros if numero >= 0]
print(calculo)

frases = ["hola", "que tal", "epanadiplosis", "Bu", "En un lugar de la mancha", "otorrinolaringologo"]

# Vamos a hacer un código que filtre las palabras con una longitud mayor de 4
# Si tienen un espacio dejamos la cadena, si no tienen ningún espacio ponemos "No es frase"
# yo empiezo por el núcleo que siempre es recorrer la lista
filtro = [frase for frase in frases]
# puesto que ni filtro ni pongo expresión lo siguiente me devuelve la propia lista
print(filtro)  # ["hola", "que tal", "epanadiplosis", "Bu", "En un lugar de la mancha", "otorrinolaringologo"]
# Aplico la condición, la longitud debe ser mayor de 4
filtro = [frase for frase in frases if len(frase) > 4]
print(filtro)  # ["que tal", "epanadiplosis",  "En un lugar de la mancha", "otorrinolaringologo"]
# Ahora tengo que construir el operador ternario que, si tiene un espacio me devuelve la frase
# Y si no lo tiene me devuelve "No hay frase2
# Empiezo por el núcleo
# if " " in frase
# Si se cumple: devuelvo frase
# Si no se cumple: devuelvo "No es frase"
# frase if " " in frase else "No es frase"
# Meto el operador ternario en lo que tenía antes
filtro = [frase if " " in frase else "No es frase" for frase in frases if len(frase) > 4]
print(filtro)  # ['que tal', 'No es frase', 'En un lugar de la mancha', 'No es frase']

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos