Conjuntos
1. Un conjunto es una colección desordenada de elementos únicos. Sus principales usos son:
- Eliminar duplicados: al convertir una lista en conjunto, se eliminan automáticamente los duplicados.
- Pruebas de relaciones: permite probar relaciones como intersección, diferencia, unión, etc. entre dos grupos de datos.
2. Tipos de conjuntos
- Matemáticamente, un conjunto se define como una colección de elementos distintos. A los miembros del conjunto se les suele llamar elementos del conjunto.
- Un objeto conjunto es un grupo de valores hasheables dispuestos de forma desordenada.
- Hay dos tipos de conjuntos: conjuntos mutables (set) y conjuntos inmutables (frozenset).
>>> c1 = set('hola')
>>> c2 = frozenset('hola')
>>> c1
{'h', 'o', 'l', 'a'}
>>> c2
frozenset({'h', 'o', 'l', 'a'})
3. Operadores de conjuntos
- Se pueden usar los operadores
inynot inpara comprobar membresía. - Se puede obtener el tamaño con
len(). - Se puede iterar sobre los miembros con
for. - No se puede hacer slicing ni acceder por clave.
>>> len(c2)
4
>>> for ch in c1:
... print(ch)
h
o
l
a
|: Unión&: Intersección-: Diferencia
>>> c1 = set('abc')
>>> c2 = set('cde')
>>> c1 | c2
{'a', 'c', 'b', 'e', 'd'}
>>> c1 & c2
{'c'}
>>> c1 - c2
{'a', 'b'}
4. Métodos incorporados de conjuntos
set.add(elemento): Agrega un elemanto como un todo. Solo uno a la vez.set.update(iterable): Agrega los elementos del iterable de forma dispersa. Se pueden agregar varios.set.remove(elemento): Elimina un elemento. Lanza KeyError si no existe.
>>> print(c1)
{'h', 'e', 'l', 'o'}
>>> c1.add('nuevo')
>>> print(c1)
{'h', 'e', 'l', 'o', 'nuevo'}
>>> c1.update('nuevo')
>>> print(c1)
{'e', 'h', 'l', 'o', 'n', 'w', 'nuevo'}
>>> c1.remove('n')
>>> print(c1)
{'e', 'h', 'l', 'o', 'w', 'nuevo'}
s.issubset(t): Devuelve True si s es subconjunto de t.s.issuperset(t): Devuelve True si s es superconjunto de t.s.union(t): Devuelve un nuevo conjunto con la unión de s y t.s.intersection(t): Devuelve un nuevo conjunto con la intersección de s y t.s.difference(t): Devuelve un nuevo conjunto con los elementos de s que no están en t.
Métodos de conjuntos:
| # | Función | Descripción |
|---|---|---|
| 1 | add(self, *args, **kwargs) |
Agrega el elemento como un todo al conjunto. |
| 2 | clear(self, *args, **kwargs) |
Vacía todos los elementos del conjunto. |
| 3 | copy(self, *args, **kwargs) |
Copia superficial de todos los elementos del conjunto. |
| 4 | difference(self, *args, **kwargs) |
Calcula la diferencia entre dos conjuntos. |
| 5 | difference_update(self, *args, **kwargs) |
Elimina del conjunto los elementos presentes en otro conjunto. |
| 6 | discard(self, *args, **kwargs) |
Elimina el elemento x si existe, no lanza error si no. |
| 7 | intersection(self, *args, **kwargs) |
Calcula la interseccción de dos conjuntos. |
| 8 | intersection_update(self, *args, **kwargs) |
Actualiza el conjunto conservando solo los elementos que también están en otro. |
| 9 | isdisjoint(self, *args, **kwargs) |
Determina si dos conjuntos son disjuntos (no tienen elementos en común). |
| 10 | issubset(self, *args, **kwargs) |
Determina si el conjunto es subconjunto de otro (a <= b). |
| 11 | issuperset(self, *args, **kwargs) |
Determina si el conjunto es superconjunto de otro (a >= b). |
| 12 | pop(self, *args, **kwargs) |
Elimina y devuelve un elemento arbitrario. Lanza KeyError si está vacío. |
| 13 | remove(self, *args, **kwargs) |
Elimina el elemento. Lanza KeyError si no existe. |
| 14 | symmetric_difference(self, *args, **kwargs) |
Devuelve un nuevo conjunto con los elementos que están en uno u otro pero no en ambos. |
| 15 | symmetric_difference_update(self, *args, **kwargs) |
Actualiza el conjunto con la diferencia simétrica respecto a otro. |
| 16 | union(self, *args, **kwargs) |
Devuelve la unión de dos conjuntos. |
| 17 | update(self, *args, **kwargs) |
Agrega múltiples elementos al conjunto. |
1. Definir un conjunto
# Primera forma
numeros = [1,2,3,4,5,6,7]
conjunto_numeros = set(numeros)
print(conjunto_numeros)
# Resultado: {1, 2, 3, 4, 5, 6, 7}
# Segunda forma
conjunto_numeros = {1,2,3,4,5,6,7}
print(conjunto_numeros)
# Resultado: {1, 2, 3, 4, 5, 6, 7}
2. Agregar (actualizar)
numeros = {1,2,3,4,5,6,7}
# set.add() solo agrega un elemento, no varios
# numeros.add(8)
# print(numeros)
# set.update() puede agregar una cadena o varios valores
# numeros.update([8])
# print(numeros)
# numeros.update('8')
# print(numeros)
numeros.update([8,9,10])
print(numeros)
# Resultado: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
3. Eliminar
numeros = {1,2,3,4,5,6,7}
numeros.remove(7)
print(numeros)
# Resultado: {1, 2, 3, 4, 5, 6}
4. Consultar: no se puede indexar por posición.
5. Modificar: los conjuntos son mutables, pero no se pueden modificar elementos individuales; se pueden agregar o eliminar.
6. Intersección (&)
conj1 = {1, 2, 3, 4, 5, 6}
conj2 = {1, 2, 3, 4, 5, 10, 7, 8, 9}
# Forma 1 con &
interseccion = conj1 & conj2
print(interseccion)
# Forma 2 con intersection()
interseccion2 = conj1.intersection(conj2)
print(interseccion2)
# Resultado: {1, 2, 3, 4, 5}
7. Unión (|)
conj1 = {1, 2, 3, 4, 5, 6}
conj2 = {1, 2, 3, 4, 5, 10, 7, 8, 9}
# Forma 1 con |
union = conj1 | conj2
print(union)
# Forma 2 con union()
union2 = conj1.union(conj2)
print(union2)
# Resultado: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
8. Diferencia (-)
conj1 = {1, 2, 3, 4, 5, 6}
conj2 = {1, 2, 3, 4, 5, 10, 7, 8, 9}
# Forma 1 con -
dif1 = conj1 - conj2
print(dif1) # {6}
dif2 = conj2 - conj1
print(dif2) # {8, 9, 10, 7}
# Forma 2 con difference()
dif3 = conj1.difference(conj2)
print(dif3) # {6}
dif4 = conj2.difference(conj1)
print(dif4) # {8, 9, 10, 7}
9. Diferencia simétrica (^)
conj1 = {1, 2, 3, 4, 5, 6}
conj2 = {1, 2, 3, 4, 5, 10, 7, 8, 9}
# Forma 1 con ^
sim1 = conj1 ^ conj2
print(sim1) # {6, 7, 8, 9, 10}
# Forma 2 con symmetric_difference()
sim2 = conj2.symmetric_difference(conj1)
print(sim2) # {6, 7, 8, 9, 10}
10. Conversión de conjuntos
conjunto = set(range(4))
lista = list(conjunto)
tupla = tuple(conjunto)
cadena = str(conjunto)
print(lista, type(lista)) # [0, 1, 2, 3] <class 'list'>
print(tupla, type(tupla)) # (0, 1, 2, 3) <class 'tuple'>
print(cadena, type(cadena)) # {0, 1, 2, 3} <class 'str'>
Complemento: frozenset
Un conjunto inmutable. Es como un conjunto (set) pero no se puede modificar.
# Crear un frozenset con datos
info = frozenset(('estudiar', 'trabajar', 'examen', 'descansar'))
print(info, type(info))
# Comprobación de membresía
resultado = 'trabajar' in info
print(resultado)
# Iteración sobre el frozenset
for i in info:
print(i)
# Comprensión de conjuntos (no produce frozenset, sino set)
resultado_comp = {i for i in info}
print(resultado_comp, type(resultado_comp))
# Funciones que no modifican el conjunto
info_copia = info.copy()
print(info_copia)
# Operaciones entre conjuntos: unión, intersección, etc.
info2 = {'estudiar', 'trabajar', 'examen', 'descansar'}
resultado_union = info.union(info2)
print(resultado_union) # frozenset
resultado_union2 = info2.union(info)
print(resultado_union2) # set
Ejemplos de operaciones con conjuntos
>>> s = set(["hola mundo"])
>>> s.add('python') # agregar
>>> s
{'python', 'hola mundo'}
>>> s.clear()
>>> s
set()
>>> s = set(["hola mundo"])
>>> s2 = s.copy()
>>> s2
{'hola mundo'}
>>> a = set([1,2,3,4,5])
>>> b = set([1,3,5,7,9])
>>> a.difference(b) # elementos en a que no están en b
{2, 4}
>>> b.difference(a)
{9, 7}
>>> a.difference_update(b) # actualiza a con la diferencia
>>> a
{2, 4}
>>> a = set([1,2,3,4,5])
>>> b = set([1,3,5,7,9])
>>> b.difference_update(a)
>>> b
{7, 9}
>>> a = set([1,2,3,4,5])
>>> b = set([1,3,5,7,9])
>>> a.discard(3) # elimina 3 si existe
>>> a
{1, 2, 4, 5}
>>> a.discard(6) # no hace nada
>>> a
{1, 2, 4, 5}
>>> a.intersection(b) # intersección
{1, 5}
>>> b.intersection(a)
{1, 5}
>>> a.intersection_update(b) # actualiza a con intersección
>>> a
{1, 5}
>>> a = set([1,2,3,4,5])
>>> b = set([1,3,5,7,9])
>>> a.isdisjoint(b) # ¿disjuntos?
False
>>> a.issubset(b) # ¿a subconjunto de b?
False
>>> a.issuperset(b) # ¿a superconjunto de b?
False
>>> a.pop()
1
>>> a
{2, 3, 4, 5}
>>> a.remove(3)
>>> a
{2, 4, 5}
>>> a.symmetric_difference(b) # diferencia simétrica
{2, 4, 7, 9}
>>> a.symmetric_difference_update(b)
>>> a
{2, 4, 7, 9}
>>> a.union(b) # unión
{1, 2, 3, 4, 5, 7, 9}
>>> a.update("10") # agrega elementos de la cadena
>>> a
{2, 4, 7, 9, '1', '0'}
>>> a.update(b)
>>> a
{1, 2, 3, 4, 5, 7, 9, '1', '0'}