Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

Colecciones por comprensión


Cita con formato IEEE:
E. Bahit, "Colecciones por comprensión", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 43–48.

Cita con formato APA 7:
Bahit, E. (2022). Colecciones por comprensión. In Python Aplicado (4th ed., pp. 43–48). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

El concepto de comprensión en este ámbito puede resultar confuso. Para evitar ambigüedades se optará por describir su significado dentro del contexto al cual se refiere.

En este sentido, la generación de colecciones por comprensión, se refiere a la facultad de crear colecciones, por medio de la descripción del procedimiento que genera cada uno de los elementos que la conforman.

Listas y conjuntos por comprensión

La generación por comprensión se basa en el método de tabulación para la descripción de conjuntos.

Si la generación de colecciones por comprensión se pudiese hacer describiendo el procedimiento en lenguaje natural, una lista de números naturales menores que 6, se generaría diciendo que:

lista = [número natural, para todos los números naturales menores que seis]

Pero dado que la lista anterior podría generarse sin un procedimiento complejo, describirla por comprensión perdería sentido ya que puede crearse mediante:

lista = range(1, 6)

Sin embargo, la lista anterior podría necesitar generarse a partir del siguiente enunciado:

A = \{x: \forall x \in X, \; x \in \mathbb{N} \wedge x < 6\}

Lo anterior, define un conjunto llamado A, formado por una colección de elementos x, que se toman de un conjunto X, cada vez que se cumple que x pertenece al conjunto de los números naturales \mathbb{N}, y además es menor que 6.

Aquí, los elementos del conjunto (o lista) X, son desconocidos, y los elementos que sean números naturales menores que 6, podrían ser incluso menos que 5 números, pues los elementos del conjunto X no se conocen.

De modo tradicional, para crear una lista con esos elementos, habría que recorrer el conjunto X, y constatar si:

O, lo que es igual, si el elemento es un entero, mayor que cero y menor que seis:

for x in X:
if isinstance(x, int) and x > 0 and x < 6:
  A.append(x)

Viendo el ejemplo anterior más de cerca, se obtendría lo siguiente:

>>> X = ['a', 'b', 1, 'c', 3, 6, 'h', 4]
>>> A = []
>>> for x in X:
...     if isinstance(x, int) and x > 0 and x < 6:
...             A.append(x)
... 
>>> A
[1, 3, 4]

Crear la lista anterior por comprensión, implicaría describir el enunciado previo en código fuente. Es decir, tomar el enunciado «número natural, para todos los números naturales menores que seis» o su formalización A = \{x: \forall x \in X, \; x \in \mathbb{N} \wedge x < 6\} , y traducir cualquiera de los dos, a código fuente. Algo como:

A = [<aquí el código>]

Si se traduce el enunciado formal, podría resultar algo como esto:

A = [x for x in X if isinstance(x, int) and x > 0 and x < 6]

Recuperando el código del primer ejemplo, el resultado sería el siguiente:

>>> X = ['a', 'b', 1, 'c', 3, 6, 'h', 4]
>>> A = [x for x in X if isinstance(x, int) and x > 0 and x < 6]
>>> A
[1, 3, 4]

Las colecciones por comprensión se crean formalizando el conjunto que se desea crear y traduciendo a código fuente dicha formalización.

De hecho, el enunciado formal de un conjunto, se puede traducir literalmente en un conjunto, reemplazando los corchetes por llaves:

>>> X = ['a', 'b', 1, 'c', 3, 6, 'h', 4]
>>> A = {x for x in X if isinstance(x, int) and x > 0 and x < 6}
>>> A
{1, 3, 4}
>>> type(A)
<class 'set'>

No obstante, muchas personas prescinden de formalizar un enunciado, y se arrojan directamente a creer listas por comprensión.

A continuación, se proponen algunos ejemplos más, a fin de lograr una mayor familiarización con el método de generación de listas por comprensión.

Ejemplo #1: A partir de una lista de palabras, generar una lista por comprensión con las palabras que comienzan por ‘a’.

>>> palabras = [
  'beta', 'alga', 'gama', 'alma', 'zeta', 'arranque'
]
>>> lista = [p for p in palabras if p.startswith('a')]
>>> lista
['alga', 'alma', 'arranque']

La misma lista creada de forma tradicional:

>>> palabras = [
  'beta', 'alga', 'gama', 'alma', 'zeta', 'arranque'
]
>>> lista = []
>>> for p in palabras:
  if p.startswith('a'):
    lista.append(p)

Ejemplo #2: A partir de una lista de números, generar una lista por comprensión solo con números enteros.

>>> numeros = [12.5, -6, 9, 12, -3.4, 0]
>>> lista = [n for n in numeros if isinstance(n, int)]
>>> lista
[-6, 9, 12, 0]

La misma lista creada de forma tradicional:

>>> numeros = [12.5, -6, 9, 12, -3.4, 0]
>>> lista = []
>>> for n in numeros:
  if isinstance(n, int):
    lista.append(p)

Diccionarios por comprensión

Además de listas y conjuntos, también pueden crearse diccionarios:

...

Sintaxis para colecciones por comprensión

La sintaxis para cada caso es la misma, y solo varían...