Translate

miércoles, 18 de noviembre de 2020

Listas, conjuntos definidos por comprensión en Python


Las comprensiones son construcciones que permiten construir secuencias a partir de otras secuencias. Se admiten varios tipos de comprensión tanto en Python 2 como en Python 3:

  • listas por comprensión
  • diccionarios por comprensión
  • conjuntos  por comprensión
  • Generadores por comprensión

Las listas por comprensión proporcionan una forma breve y concisa de crear listas. Consiste en corchetes que contienen una expresión seguida de una cláusula for, luego cero o más cláusulas for o if. Las expresiones pueden ser cualquier cosa, lo que significa que puede incluir todo tipo de objetos en listas. El resultado sería una nueva lista realizada después de la evaluación de la expresión en el contexto de las cláusulas if y for.

variable = [out_exp for out_exp in input_list if out_exp == 2]

Aquí hay un pequeño ejemplo:

multiples = [i for i in range(30) if i % 3 == 0]

print(multiples)

# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

Esto puede resultar muy útil para hacer listas rápidamente. Algunos incluso lo prefieren en lugar de la función de filtro. Las comprensiones de listas realmente brillan cuando desea proporcionar una lista a un método o función para hacer una nueva lista agregándola en cada iteración del ciclo for. Por ejemplo, normalmente haría algo como esto:

squared = []

for x in range(10):

    squared.append(x**2)

Puede simplificarlo usando listas por comprensión. Por ejemplo:

squared = [x**2 for x in range(10)]

Los diccionarios por comprensión se utilizan de forma similar. Aquí hay un ejemplo que encontré recientemente:

mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

mcase_frequency = {

    k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)

    for k in mcase.keys()

}

# mcase_frequency == {'a': 17, 'z': 3, 'b': 34}

En el ejemplo anterior, estamos combinando los valores de las claves que son iguales pero en diferentes tipos de letra. También puede cambiar rápidamente las claves y los valores de un diccionario:

{v: k for k, v in some_dict.items()}

Los conjuntos  por comprensión también son similares a las listas por comprensión. La única diferencia es que usan llaves {}. Aquí hay un ejemplo:

squared = {x**2 for x in [1, 1, 2]}

print(squared)

# Output: {1, 4}

Los Generadores por comprensión también son similares a las listas por comprensión. La única diferencia es que no asignan memoria para toda la lista, sino que generan un elemento a la vez, por lo que la memoria es más eficiente.

multiples_gen = (i for i in range(30) if i % 3 == 0)

print(multiples_gen)

# Output: <generator object <genexpr> at 0x7fdaa8e407d8>

for x in multiples_gen:

  print(x)

  # Outputs numbers