Python: El producto cartesiano

Objetivo: mostrar una técnica eficiente para determinar el producto cartesiano de dos conjuntos empleando listas por comprensión.

Imagina que entre la equipación deportiva que incluye tu armario figuran camisetas de cuatro colores: blanco, verde, azul y amarillo. Dispones, además, de tres tipos de pantalones: largo, medio y corto.

¿De cuántas maneras distintas podrías vestirte para salir a correr?

La respuesta la facilita el concepto de producto cartesiano, que con certeza estudiaste en los primeros cursos de matemáticas. Un breve repaso…

Sean dos conjuntos independientes A y B, al conjunto de todas las agrupaciones posibles que se forman tomando un elemento de A y otro de B, se le denomina producto cartesiano de A y B y se denota como A x B.

Además, el número de elementos de que consta A x B es el número de elementos de A multiplicado por el número de elementos de B.

Para referirnos al número de elementos de un conjunto recurrimos al término cardinal, de modo que:

card(A x B) = card(A) x card(B)

Este concepto es extensible a más de dos conjuntos: el cardinal del producto cartesiano de varios conjuntos es el producto de los cardinales individuales.

En nuestro ejemplo, si tenemos cuatro tipos de camisetas y tres de pantalones, dispondremos de 12 maneras diferentes de vestirnos.

Nuestra labor pythonesca va a ser listar todos estos pares y para ello recurriremos a la técnica de las listas por comprensión que presentamos en los últimos artículos y que ahora refinaremos de un modo particular.

Comencemos definiendo las estructuras:

>>> camisetas = {'blanca', 'verde', 'azul', 'amarilla'}
>>> pantalones = {'largo', 'medio', 'corto'} 

He elegido conjuntos por mayor similitud conceptual, pero, naturalmente, puedes emplear cualquier tipo de secuencia como las listas o las tuplas.

Creemos nuestra lista por comprensión:

1) Recorremos el iterable:

for c in camisetas for p in pantalones

Esta es el punto crítico al que quería llegar. En las listas por comprensión podemos anidar tantos for como deseemos.

2) A la izquierda de lo anterior escribimos lo que deseamos obtener:

(c, p) for c in camisetas for p in pantalones

He optado por agrupar cada par en una tupla.

3) A la derecha del todo escribimos la condición de filtrado.

En este ejemplo no hay ninguna, por lo que no es aplicable.

4) Rodeamos toda la expresión entre llaves y ya tenemos creada la lista por comprensión.

>>> [(c, p) for c in camisetas for p in pantalones]
[('verde', 'corto'), ('verde', 'medio'), ('verde', 'largo'), 
('amarilla', 'corto'), ('amarilla', 'medio'), ('amarilla', 'largo'), 
('azul', 'corto'), ('azul', 'medio'), ('azul', 'largo'), 
('blanca', 'corto'), ('blanca', 'medio'), ('blanca', 'largo')]

Programar con eficacia y eficiencia supone armarse con una buena colección de usos típicos para resolver problemas frecuentes, como por ejemplo hallar el producto cartesiano. Las listas por comprensión, sin duda, figurarán en muchos de esos usos.

Javier Montero Gabarró


Python: El producto cartesiano


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Python – Listas por comprensión – 2

Objetivo: presentar la sintaxis extendida de la generación de listas por comprensión en Python.

En el artículo anterior mostramos la elegancia de Python en la forma de las listas por comprensión, mecanismo que nos permitía, con una única instrucción, generar una lista a través de la transformación de los elementos de un iterable.

Vamos a dar un pase adelante y refinemos la creación de esa lista mediante la introducción de un filtro selectivo.

Dado el siguiente listado de alumnos de una clase:

>>> alumnos = ['Ana', 'Luis', 'Pedro', 'Marta', 'Nerea', 'Pablo']

Supongamos que queremos obtener las iniciales de todas las chicas del grupo.

Obtener simplemente las iniciales no debería plantearte mucho problema con las técnicas que ya conoces:

>>> [alumno[0] for alumno in alumnos]
['A', 'L', 'P', 'M', 'N', 'P']

Recorremos la lista alumnos de alumno en alumno y nos quedamos con la primera letra de cada uno (alumno[0]).

Pero, ¿podemos realizar el filtrado de sexo manteniendo la elegancia de las listas por comprensión?

Es preciso recurrir a la sintaxis extendida:

– Comenzamos recorriendo el iterable.

– Escribimos a la izquierda la transformación deseada.

– Escribimos a la derecha la condición de filtrado.

– Encerramos todo el conjunto entre corchetes.

He aquí la solución buscada:

>>> [alumno[0] for alumno in alumnos if alumno[-1] == 'a']
['A', 'M', 'N']

Observa que alumno[-1] representa a la última letra de cada nombre. Naturalmente, nos hemos permitido simplificar el problema presuponiendo que los nombres de mujer son aquellos que terminan en a.

Recuerda que las listas por comprensión no modifican la lista original sino que crean otra nueva.

El primer término no tiene que implicar necesariamente una transformación. Por ejemplo, si en vez de la inicial queremos el nombre completo, podríamos haber procedido así, obviamente:

>>> [alumno for alumno in alumnos if alumno[-1] == 'a']
['Ana', 'Marta', 'Nerea']

Vamos a complicarlo algo más. El siguiente diccionario contiene las calificaciones de esos alumnos:

>>> notas = {'Ana':9, 'Luis':7, 'Pedro':2, 'Marta':5, 'Nerea':4, 'Pablo':6}

Debemos obtener los nombres de todos aquellos que hayan aprobado:

Desglosemos la lista por comprensión en sus tres términos. Comenzamos por el central, correspondiente a la iteración:

for nombre, nota in notas.items()

Fíjate en el uso del método items() para poder iterar simultáneamente sobre las claves y los valores del diccionario.

En el primer término indicamos lo que queremos extraer:

nombre

Y en el tercero realizamos el filtrado:

if nota >= 5

Todo junto, entre corchetes, nos devuelve la lista buscada:

>>> [nombre for nombre, nota in notas.items() if nota >= 5]
['Ana', 'Luis', 'Pablo', 'Marta']

No te costará mucho habituarte a las listas por comprensión. Código limpio y eficiente, ¡Python es esto, quién podría resistirse?

Javier Montero Gabarró


Python – Listas por comprensión – 2


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies