Apéndice K — Conjuntos.

Objetivo. Describir la estructura de datos set mediante la exposición de ejemplos.

K.1 Introducción

Recordemos los cuatro tipos de colecciones que se tienen en Python:

Tipo Ordenada Inmutable Indexable Duplicidad
List SI NO SI SI
Tuple SI SI SI SI
Sets NO NO NO NO
Dict NO NO SI NO

K.2 Conjuntos

  • Consisten en una secuencia NO ordenada y mutable.
  • NO permite miembros duplicados.
  • Los elementos de los conjuntos NO se pueden indexar.
  • Los conjuntos se definen usando llaves ({}) y comas (,) para separar sus elementos.
Ejemplo K.1: Creación de conjuntos.

Construiremos los siguientes conjuntos:

c1 = {4, 1, 8, 0, 4, 20}
c2 = {'z', 'x', 'g', 'a', 'k', 'x'}
c3 = {'a', 1.5, 3, 5+4j, (1,2,3)}

Creamos los conjuntos:

c1 = {4, 1, 8, 0, 4, 20}
c2 = {'z', 'x', 'g', 'a', 'k', 'x'}
c3 = {'a', 1.5, 3, 5+4j, (1,2,3)}
print(type(c1), c1)
print(type(c2), c2)
print(type(c3), c3)
<class 'set'> {0, 1, 4, 20, 8}
<class 'set'> {'k', 'g', 'x', 'z', 'a'}
<class 'set'> {1.5, (5+4j), 3, (1, 2, 3), 'a'}

Observa que los conjuntos c1 y c2 contienen en su definición elementos repetidos, pero posteriormente cuando se usa o se imprime el conjunto, los elementos repetidos se eliminan.

K.3 Funciones incorporadas que operan sobre conjuntos.

Prácticamente todas las funciones incorporadas que se aplican a las listas y tuplas, se pueden aplicar a los conjuntos, por ejemplo:

print(len(c1))
print(max(c1))
print(min(c1))
print(all(c1))
print(any(c1))
print(sorted(c1))
print(sum(c1))
5
20
0
False
True
[0, 1, 4, 8, 20]
33
list(enumerate(c1)) 
[(0, 0), (1, 1), (2, 4), (3, 20), (4, 8)]
list(zip(c1, c2)) 
[(0, 'z'), (1, 'g'), (4, 'x'), (20, 'a'), (8, 'k')]

K.4 Métodos de los conjuntos.

En términos de Programación Orientada a Objetos, la clase <class 'set'> define una serie de métodos que se pueden aplicar sobre los objetos del tipo set. Veamos algunos ejemplos:

print(c1)  # Conjunto original
c1.add(-8) # Adiccionar un elemento
print(c1)  # Revisamo el estado del conjunto
{0, 1, 4, 20, 8}
{0, 1, 4, 20, 8, -8}
print(c1)    # Conjunto original
c1.remove(4) # Eliminar un elemento del conjunto
print(c1)    # Revisamo el estado del conjunto
{0, 1, 4, 20, 8, -8}
{0, 1, 20, 8, -8}

Si el elemento que se desea eliminar del conjunto no existe dentro del mismo, entonces se obtiene un error al tratar de eliminar dicho elemento:

c1.remove(4)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[10], line 1
----> 1 c1.remove(4)

KeyError: 4

A un conjunto que ya existe se le pueden eliminar todos sus elementos:

# Estado inicial del conjunto
print(c1, type(c1), id(c1))
c1.clear() # Limpiar todos los elementos del conjunto
print(c1, type(c1), id(c1))
{0, 1, 20, 8, -8} <class 'set'> 1934565229280
set() <class 'set'> 1934565229280

Observa que el identificador no ha cambiado, solo se eliminaron todos los elementos.

Ejemplo K.2: Verificar si un elemento está en un conjunto.

Escribe un algoritmo que, usando el operador in, verifique si un elemento está en un conjunto. Si el elemento está en el conjunto entonces eliminarlo con el métodos set.remove() e imprimir un mensaje de que dicho elemento ha sido removido. Si el elemento no está en el conjunto, entonces imprimir un mensaje avisando que no se encontró el elemento.

Hacer una prueba con el siguiente conjunto: test = {1,2,3,'a','b','c'}.

Para saber si un elemento está en el conjunto podemos usar in:

# Definimos el conjuntos
test = {1,2,3,'a','b','c'}
print('Conjunto original:', test)

# elemento a eliminar
elemento = -8

print(f"Elemento a eliminar: {elemento}")
# Algoritmo de verificación
if elemento in test:
    test.remove(elemento)
    print(f"El elemento '{elemento}' ha sido removido del conjunto")
else:
    print(f"El elemento '{elemento}' no está en el conjunto")

print('Resultado final:', test)
Conjunto original: {1, 2, 3, 'b', 'a', 'c'}
Elemento a eliminar: -8
El elemento '-8' no está en el conjunto
Resultado final: {1, 2, 3, 'b', 'a', 'c'}

K.5 Operadores sobre conjuntos

Se pueden realizar las operaciones de conjuntos definidas en matemáticas en los objetos de tipo set.

# Definimos dos conjuntos
A = {'Taza', 'Vaso', 'Mesa'}
B = {'Casa', 'Mesa', 'Silla'}
print(A)
print(B)
{'Mesa', 'Vaso', 'Taza'}
{'Mesa', 'Silla', 'Casa'}

K.5.1 in: revisar si un elemento está en el conjunto.

'Taza' in A
True

K.5.2 -: elementos en A, pero no en B.

A - B 
{'Taza', 'Vaso'}

K.5.3 |: elementos en A o en B o en ambos.

A | B 
{'Casa', 'Mesa', 'Silla', 'Taza', 'Vaso'}

K.5.4 &: elementos en ambos conjuntos.

A & B 
{'Mesa'}

K.5.5 ^ : elementos en A o en B, pero no en ambos.

A ^ B 
{'Casa', 'Silla', 'Taza', 'Vaso'}

K.6 Copiando conjuntos

Para crear un nuevo conjunto a partir de otro, usamos operaciones similares que para las listas:

K.6.1 Copiando con el método copy()

c4 = c2.copy()

print(c2, type(c2), id(c2))
print(c4, type(c4), id(c4))
{'z', 'g', 'x', 'a', 'k'} <class 'set'> 1934565230176
{'z', 'g', 'x', 'a', 'k'} <class 'set'> 1934571604224

K.6.2 Copiando con la biblioteca copy()

import copy
c5 = copy.copy(c2)

print(c2, type(c2), id(c2))
print(c5, type(c5), id(c5))
{'z', 'g', 'x', 'a', 'k'} <class 'set'> 1934565230176
{'z', 'g', 'x', 'a', 'k'} <class 'set'> 1934571605568