Python: Subconjuntos – Conjuntos disjuntos

Objetivo: implementar los conceptos de subconjuntos y conjuntos disjuntos en Python.

Vamos a ir concluyendo el tema de los conjuntos, que tengo interés en presentar pronto otra de las superestructuras fabulosas de Python, los diccionarios.

La teoría nos dice que A es subconjunto de B cuando A está incluido en B, que es lo mismo que decir que B contiene a A.

Para implementar estos conceptos en Python, disponemos de los operadores de comparación habituales:

== igual
!= distinto
>  mayor
>= mayor o igual
<  menor
<= menor o igual

A es un subconjunto de B cuando todos los elementos de A están incluidos en B, relación que expresamos por

A <= B

que es equivalente a

B >= A

Puede interesarte también la inclusión estricta:

A < B, que es lo mismo que decir B > A

Practiquemos estos operadores con los siguientes conjuntos:

>>> c1 = {1, 2, 3}
>>> c2 = {1, 2, 3}
>>> c3 = {1, 2, 3, 4, 5, 6}
>>> c4 = {2, 4, 6}
>>> c5 = {1, 3, 5}

Observa que c1 y c2 son iguales, pues contienen los mismos elementos

>>> c1 == c2
True

pero c2 y c3 no lo son:

>>> c2 != c3
True

Sin embargo, c2 es un subconjunto de c3, pues todos los elementos de aquel están incluidos en este:

>>> c2 <= c3
True

A su vez, c1 es un subconjunto de c2, aunque sean iguales:

>>> c1 <= c2
True

Pero no lo sería en sentido estricto:

>>> c1 < c2
False

El concepto de subconjunto también está disponible como método:

>>> c1.issubset(c3)
True

que debe leerse como c1 es subconjunto de c3,

y es lo mismo que

c1 <= c3

También puedes expresarlo del siguiente modo:

>>> c3.issuperset(c1)
True

que debes leerlo como c3 es superconjunto de c1, que es lo mismo que decir que c3 contiene a c1:

c3 >= c1

Para finalizar, unas palabras sobre el concepto de conjuntos disjuntos. Sabemos que dos conjuntos son disjuntos cuando no tienen elementos en común, es decir, su intersección es el conjunto vacío.

En el artículo anterior tratamos la intersección, así que ya tenemos recursos para practicar esto sobre los conjuntos c4 y c5, que como puedes observar, son disjuntos:

>>> c4 & c5 == set()
True

Recuerda que set() simboliza el conjunto vacío, y no {}, que sería un diccionario vacío, como veremos muy pronto.

Pero esta instrucción podría prestarse a error fácilmente: el uso de set() o el orden de evaluación de los operadores.

¿Qué tal esta otra, más sencilla?

>>> c4.isdisjoint(c5)
True

Se acerca el final del repaso que le estamos dando a los conjuntos en Python. En la próxima entrega presentaremos el tipo frozenset, conjunto congelado, que es como el tipo set, pero inmutable.

Qué trascendente ha sonado esta última palabra; me está entrando hasta frío…

Javier Montero Gabarró


Python: Subconjuntos – Conjuntos disjuntos


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 – Agregación y eliminación de elementos de un conjunto

Objetivo: aprender a agregar y eliminar elementos de un conjunto en Python.

Pongámonos al día. En Introducción a los conjuntos presentamos el tipo set para almacenar conjuntos. Aprendimos a crearlos, tanto un conjunto vacío, como con datos preexistentes. Vimos también cómo comprobar si un determinado elemento pertenece o no al conjunto, así como determinar la cardinalidad, es decir, el número de elementos en total.

Con estos conceptos claros, es momento de aprender a realizar otras operaciones básicas, como la agregación y eliminación de elementos a conjuntos ya existentes.

Comencemos creando un par de conjuntos sobre los que trabajaremos:

>>> c1 = set()     # El conjunto vacío
>>> c2 = {1, 2, 3, 4, 5, 6}

Para añadir elementos a un conjunto disponemos del método add.

Por ejemplo,

>>> c1.add('pimiento')
>>> c1
{'pimiento'}

Para agregar elementos a un conjunto hemos de hacerlo de uno en uno. Si intentaras meter varios de golpe se produciría una excepción.

>>> c1.add(5)
>>> c1
{'pimiento', 5}

Observa, tras esta última operación, que los elementos pueden ser de tipos variados dentro del mismo conjunto.

Fíjate en esta otra instrucción:

>>> c2.add((7, 8))

¿No hemos dicho que no se podía introducir más que un elemento cada vez?

En efecto, así es. Pero date cuenta de que no hemos introducido dos elementos, sino sólo uno: la tupla (1, 2). Observa los paréntesis.

>>> c2
{1, 2, 3, 4, 5, 6, (7, 8)}

Si no te fías, comprueba la cardinalidad:

>>> len(c2)
7

en lugar de 8.

Como vemos, agregar elementos a un conjunto es una labor simple. Borrarlos es igual de sencillo, pero nos ofrece más variedad de opciones.

Quizás no te guste tener que retirar elementos de un conjunto. Si prefieres, puedes dejar que Python se ocupe por ti de la difícil decisión empleando el método pop.

>>> c2.pop()
1

El método pop no sólo elmina un elemento, sino que además nos presenta cuál ha retirado del conjunto. No debe llevar argumentos.

>>> c2
{2, 3, 4, 5, 6, (7, 8)}

>>> c2.pop()
2
>>> c2
{3, 4, 5, 6, (7, 8)}

¿Adivinas cuál será el siguiente a extraer?

>>> c2.pop()
3

Pero no te confundas… Aunque podamos predecirlo fácilmente en este caso, considera mejor que Python te devolverá un valor arbitrario. Piensa que los elementos de un conjunto no tienen orden, aunque internamente Python pueda implementarlos de acuerdo a su propio criterio. Observa el siguiente ejemplo:

>>> c3 = {'luis', 'pedro', 'juan'}

Presta atención al orden en que han sido introducidos. Ahora observa cómo te muestra Python el conjunto:

>>> c3
{'luis', 'juan', 'pedro'}

No coincide con el orden de introducción. Ni siquiera están por orden alfabético.

Si ahora hago un pop sé que extraerá a ‘luis’, el elemento primero en ese orden peculiar, pero eso no es fácilmente deducible a partir de los datos iniciales.

>>> c3.pop()
'luis'

Lo dicho: considerara que el valor que extrae pop es completamente arbitrario.

¿Qué utilidad puede tener extraer un elemento arbitrario de un conjunto?

Imagínate que los tres amigos de antes, Luis, Pedro y Juan, han quedado a tomar unas cervezas. Llega el momento de rascarse el bolsillo y nadie parece decidirse a pagar. Mete a los tres en un conjunto y deja que Python decida…

Pero, aunque la elección es arbitraria, te recomiendo que no emplees pop si lo que de verdad buscas es aleatoriedad. Hay otras maneras más justas de hacerlo.

Para eliminar un elemento concreto de un conjunto, usa el método remove:

>>> c2.remove(5)
>>> c2
{4, 6, (7, 8)}

Pero ten mucho cuidado: si el elemento no existe te devolverá un error.

>>> c2.remove(2)
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    c2.remove(2)
KeyError: 2

Si no quieres correr ese riesgo, existe el método discard, que elimina un elemento sólo en el caso de que exista.

>>> c2.discard((7, 8))   # Eliminando la tupla (7,8)
>>> c2
{4, 6}

>>> c2.discard(2)
>>> c2
{4, 6}

Para hacer limpieza completa de un conjunto, sin remordimiento alguno, disponemos del método clear:

>>> c2.clear()
>>> c2
set()

Recuerda, por el artículo anterior, que el conjunto vacío se representa por set(), en vez de {}, que correspondería a un diccionario vacío.

Hemos colocado nuevas piezas sobre el puzzle. En el próximo artículo veremos cómo gestionar operaciones sobre conjuntos de toda la vida como la unión y la intersección.

Javier Montero Gabarró


Python – Agregación y eliminación de elementos de un conjunto


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 – Introducción a los conjuntos

Objetivo: aprender a crear conjuntos, colecciones de objetos no ordenados, y mostrar cómo determinar la pertenencia y cardinalidad.

Aprovechando que voy a hablar hoy de una estructura de datos no ordenada (en contraposición a las listas o tuplas, por ejemplo), he decidido abandonar la numeración secuencial también en los artículos sobre programación en Python (este debería ser el capítulo 35). Eso me dará más libertad a la hora de elegir los contenidos: comienzo dando capas sobre varios temas que posteriormente retomo. Gradualmente se van interconectando entre sí las distintas piezas del puzzle.

De hecho, ese el modo como aprendemos.

Piensa en los conjuntos como cuando estudiabas matemáticas de pequeño. ¿Recuerdas los famosos círculos, denominados diagramas de Venn, con elementos en su interior? ¿Recuerdas cuando solapábamos esos círculos y hablábamos de cosas como su intersección o unión?

Un conjunto no es más que eso: un conjunto de elementos. No hay un primero ni un segundo. No existe ordenación alguna en ellos: un elemento simplemente está o no está.

Python maneja dos tipos para tratar con conjuntos, en función de si necesitas modificar su contenido o no: set (mutable) y frozenset (inmutable). Hoy nos ocuparemos del primero.

Veamos cómo creamos un conjunto con ciertos elementos concretos:

>>> conjunto1 = {1, 'pimiento', 3, 5}

Esto es, para crear un conjunto, situamos entre llaves todos los elementos separados por comas. Observa como los elementos pueden ser de tipos distintos.

Podemos comprobar que conjunto1 es del tipo set:

>>> type(conjunto1)
<class 'set'>

Para crear un conjunto vacío puede ser tentador hacer algo como:

>>> conjunto2={}

Sin embargo, el resultado no sería el esperado:

>>> type(conjunto2)
<class 'dict'>

Se ha creado un diccionario, estructura que también se rodea entre llaves. Hablaremos de ellos muy pronto.

Para que conjunto2 sea un conjunto vacío debemos proceder del siguiente modo:

>>> conjunto2 = set()

Y ahora sí:

>>> type(conjunto2)
<class 'set'>

Los elementos de un conjunto sólo pueden figurar una vez en él. Observa este otro ejemplo, en el que pese a repetir el número 7 en la definición de conjunto3, sólo se nos muestra una vez:

>>> conjunto3 = {4, 7, 7, 1}
>>> conjunto3
{1, 4, 7}

Constata, a su vez, como el orden no es significativo.

Lo siguiente que debemos aprender es cómo saber si un determinado elemento pertenece a un conjunto o no. Disponemos para ello del operador in:

>>> 'pimiento' in conjunto1
True
>>> 4 in conjunto1
False

Potentísimo.

La no pertenencia se determina de modo parecido:

>>> 'pepino' not in conjunto1
True

Para finalizar este primer barniz sobre conjuntos, la función len(), que ya conoces para determinar la longitud de un string o el número de elementos de una lista, sirve también para conocer el cardinal de un conjunto, esto es, el número de elementos que lo componen.

>>> len(conjunto1)
4
>>> len(conjunto2)
0
>>> len(conjunto3)
3

El conjunto vacío, conjunto2, figura con cardinal cero, como es de esperar.

Suficiente. La próxima vez que hablemos sobre conjuntos te mostraré cómo agregar o retirar elementos de ellos.

>>> ecda = {'python', 'latex', 'armonía', 'mirc', 'musescore'}
>>> 'cocina' in ecda
False

Aunque todo se andará. Espera a ver si no publico mi peculiar receta de patatas bravas

Javier Montero Gabarró


Python – Introducción a los conjuntos


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