¿Qué son los sets de Python?
Los sets, conocidos en español como conjuntos, son estructuras de datos que almacenan valores únicos, es decir, no permiten duplicados. Al contrario de las listas o tuplas, los conjuntos no mantienen un orden específico para sus elementos; estos se colocan aleatoriamente al ejecutar el código.
Además, los elementos de un conjunto deben ser inmutables,
como str
, int
,
tuple
, float
, etc. Por lo tanto,
no se pueden incluir elementos mutables como listas dentro
de los conjuntos.
El término set, en este contexto, puede ser traducido al español como conjunto.
El tipo de dato de Python correspondiente a un conjunto, es
set
.
Espacio publicitario
¿Por qué los conjuntos solo aceptan objetos inmutables?
Principalmente, los conjuntos no aceptan objetos mutables como elementos, debido a la forma en que Python maneja los elementos en un conjunto. Los conjuntos utilizan el hash de los objetos para almacenar elementos y comprobar si existen duplicados. Como mencioné en el capítulo anterior, expliqué que uno de los requisitos para que un objeto sea hashable es que sea inmutable. Todo está relacionado en este punto.
Sintaxis de un conjunto
La sintaxis de un conjunto es la misma que una tupla o una
lista, con la diferencia de que estos se crean con unas
llaves ({ }
):
{elemento1, elemento2, elemento3, ...}
Ejemplo de uso de un conjunto
Veamos un ejemplo práctico con un conjunto:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
print(set_colores)
Si ejecutas este código, verás que los resultados son aleatorios; cada vez que lo vuelvas a ejecutar, el orden cambiará. Esto se debe a la falta de un índice de posiciones.
{'negro', 'azul', 'rojo', 'verde', 'amarillo', 'naranja', 'rosa'}
Métodos para sets de Python
Veamos a continuación algunos métodos que puedes utilizar para trabajar con conjuntos.
Añadir valores a un conjunto con el método add()
Para añadir valores a un conjunto, podemos hacerlo con el
método llamado add()
:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Añade un elemento al set
set_colores.add("marrón")
print(set_colores)
{'rosa', 'rojo', 'negro', 'verde', 'naranja', 'marrón', 'amarillo', 'azul'}
El término add significa en español, añadir.
Eliminar valores de un conjunto con el método remove()
Para eliminar valores en un conjunto, podemos utilizar el
método remove()
:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Se elimina un valor del set
set_colores.remove("azul")
print(set_colores)
{'amarillo', 'rosa', 'verde', 'negro', 'naranja', 'rojo'}
Espacio publicitario
Error por elemento inexistente
El método remove()
, nos va a dar el siguiente
error si intentamos eliminar un elemento inexistente en el
conjunto:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Se elimina un valor del set
set_colores.remove("cian")
print(set_colores)
KeyError: 'cian'
Error de clave: 'cian'
La descripción del error es breve, pero concisa. Da un error por valor inexistente, e indica cuál es.
Eliminar elementos con el método discard()
Con los conjuntos tenemos otro método para eliminar elementos. Realiza la misma función, pero si el elemento pasado no existe, simplemente ignora la acción en lugar de devolver un error.
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Se elimina un valor del set
set_colores.discard("cian")
print(set_colores)
{'amarillo', 'rosa', 'verde', 'negro', 'naranja', 'rojo'}
El término discard se traduce al español como descartar
Elementos duplicados en los conjuntos
Como he indicado al principio, los conjuntos no pueden contener valores repetidos. Esto quiere decir que si ponemos un dato varias veces, se van a descartar todas las repeticiones.
Aquí tienes una pequeña demostración:
set_colores = {"rojo", "verde", "azul", "rojo", "blanco", "rojo", "rojo"}
print(set_colores)
{'rojo', 'verde', 'blanco', 'azul'}
El valor "rojo"
ha sido escrito 4 veces en la
declaración, pero realmente se queda el mismo elemento una
sola vez.
Error por elemento mutable
El siguiente error se producirá cuando intentemos asignar a un conjunto, un elemento no hashable, como puede ser una lista:
lista_numeros = [10,20,30,40]
set_numeros = {76, 47, lista_numeros}
TypeError: unhashable type: 'list'.
Error de tipo: tipo de dato no hashable: 'list'.
Para solucionar este fallo, tan solo cambia la lista por un elemento hashable como puede ser una tupla:
tupla_numeros = (10,20,30,40)
set_numeros = {76, 47, tupla_numeros}
Espacio publicitario
Ver el total de elementos que tiene un conjunto
Para contar el total de elementos que tiene un objeto como
un conjunto, puedes utilizar la función predefinida
len()
de Python:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Se cuentan los elementos
cantidad_elementos = len(set_colores)
print(f"El objeto tiene {cantidad_elementos} elementos.")
El objeto tiene 7 elementos.
Lo mismo puedes hacer con otros objetos iterables de Python, como las listas, tuplas, cadenas, etc.
saludo = "Hola"
# Se cuentan los caracteres
cantidad_caracteres = len(saludo)
print(f"El texto tiene {cantidad_caracteres} caracteres.")
El texto tiene 4 caracteres.
Los ejemplos de este apartado funcionan también con listas y tuplas.
Ver los valores mayores y menores de un conjunto
Mediante el uso de las funciones predefinidas
min()
y max()
de Python, puedes
obtener los valores mínimo y máximo de un conjunto,
respectivamente.
Empecemos con la función min()
que mostrará
el valor más bajo contenido en el conjunto:
set_colores = {100, 6578, 54, 4, 56, 2}
# Se busca el valor más bajo del conjunto
valor_minimo = min(set_colores)
print(f"El valor mínimo del conjunto es: {valor_minimo}")
El valor mínimo del conjunto es: 2
La función max()
mostrará el valor máximo en
el conjunto:
set_colores = {100, 6578, 54, 4, 56, 2}
# Se busca el valor más alto del conjunto
valor_maximo = max(set_colores)
print(f"El valor máximo del conjunto es: {valor_maximo}")
El valor máximo del conjunto es: 6578
Es posible encontrar los valores mayores y menores de conjuntos con cadenas de caracteres. En este caso, la lógica se aplica en orden alfabético.
En el siguiente ejemplo se obtiene el valor
"amarillo"
por ser la palabra menor
alfabéticamente hablando:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Se busca el color más "pequeño" alfabéticamente
color = min(set_colores)
print(color)
amarillo
En el siguiente ejemplo se obtiene el valor
"verde"
por ser la palabra mayor
alfabéticamente hablando:
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
# Se busca el color más "grande" alfabéticamente
color = max(set_colores)
print(color)
verde
Si utilizas los métodos
min()
ymax()
con una cadena de caracteres, estos obtendrán solo el caracter menor o mayor, respectivamente.
Espacio publicitario
Inmutabilidad con frozensets
Para que entiendas bien lo que son los frozensets, vamos a hacer una comparación.
Frozenset se puede traducir al español como conjunto congelado.
Las listas y las tuplas son elementos muy parecidos. Ambos tipos de elementos tienen índice de posición (son iterables). Sin embargo, la diferencia destacable entre ambos es que la lista es mutable y la tupla inmutable.
Con los conjuntos también contamos con su semejante, los frozensets.
Un conjunto es mutable, ya que puedes añadirle elementos o eliminarlos, como hemos hecho anteriormente con sus métodos. Entonces, para cuando necesitemos conjuntos inmutables, tendremos a mano los frozensets.
Que un frozenset sea inmutable significa que una vez que se crea, no se puede modificar añadiendo, eliminando o cambiando elementos. Los frozensets son útiles cuando se necesita garantizar que los datos no cambien después de su creación, especialmente en contextos donde la inmutabilidad es necesaria o preferible.
Sintaxis de un frozenset
La sintaxis de un frozenset es la siguiente:
frozenset([elemento1, elemento2, elemento3, ...])
Ejemplo práctico con un frozenset:
numeros = frozenset([1, 2, 3, 4, 5])
print(numeros)
frozenset({1, 2, 3, 4, 5})
Si intentas mutar el frozenset, recibirás el siguiente error:
numeros = frozenset([1, 2, 3, 4, 5])
numeros.add(300)
print(numeros)
AttributeError: 'frozenset' object has no attribute 'add'
Error de atributo: el objeto de tipo 'frozenset' no tiene el atributo 'add'
Todavía te queda mucho por aprender sobre los conjuntos. Por el momento lo he tratado de forma básica, para que entiendas lo que es un conjunto.
Los conjuntos empezarás a manejarlos mejor cuando empieces a estudiar temas concretos que los requieran. Temas como la ciencia de datos.
Espacio publicitario
Espacio publicitario
Ejercicios de Python para resolver
46. ¿En qué posición del índice está el color "azul"?
set_colores = {"rojo", "verde", "azul", "amarillo", "naranja", "negro", "rosa"}
El valor "azul"
no está en ninguna
posición de índice concreta, puesto que los conjuntos
no tienen índice.
Esto se trataba de una pregunta trampa para ver si habías prestado atención al capítulo.
Espacio publicitario