
Operaciones con sets de Python
Capítulo 9: Operaciones con sets
En este capítulo, vas a ver una serie muy variada de ejemplos prácticos para trabajar con sets de Python.
Buscar elementos en un set de Python
Se puede saber o buscar un elemento en un set con una sintaxis extremadamente corta:
a = {'a', 'b'}
print('a' in a)
Si coincide, el resultado es True, en cambio, si no coincide es False.
True
Por supuesto, puedes utilizar esto con otros tipos de datos, no solo con strings.
Si quieres hacer la búsqueda a la inversa, es decir buscar que un elemento no exista un en un set, añade un not.
a = {1, 2}
print(3 not in a)
Puesto que 3 no está en el set devuelve True.
True
Eliminar elementos de un set de Python
Podemos eliminar fácilmente un elemento del set con remove.
a = {1, 2}
a.remove(1)
print(a)
Se ha eliminado correctamente el valor 1 y nos queda solo el valor 2.
{2}
Lo mismo podemos hacer con discard().
a = {1, 2}
a.discard(1)
print(a)
Hay una diferencia fundamental entre remove() y discard(). Si eliminamos un elemento del set con remove(), lo elimina, pero si intentamos eliminarlo de nuevo, va a dar error porqué no encuentra el elemento.
En cambio, esto no ocurre con discard(), este ignora el error completamente.
a = {1, 2}
a.remove(1)
a.remove(1)
print(a)
Sencillamente, devuelve un error de clave (KeyError), ya que no la encuentra.
Traceback (most recent call last):
File "Ruta del archivo", line X, in module a.remove(1)
KeyError: 1
En cambio a discard, esto le da igual, ignora el fallo:
a = {1, 2}
a.discard(1)
a.discard(1)
print(a)
Se ha eliminado correctamente el valor 1 y nos queda solo el valor 2. Después intenta eliminarlo de nuevo, y al ver que no existe, lo ignora en lugar de devolver un KeyError.
{2}
Añadir elementos a un set de Python
Se pueden añadir nuevos elementos a un set con add():
a = {1, 2}
a.add(3)
print(a)
{1, 2, 3}
Si quieres añadir varios elementos de una sola vez, Puedes utilizar update().
a = {1, 2}
a.add({3, 4, 5, 6})
print(a)
Fíjate que con update() hay que poner las llaves dentro del paréntesis.
{1, 2, 3, 4, 5, 6}
Uniones de sets en Python
Es posible unir dos sets con union.
set1 = {1, 1, 2, 3, 4, 4}.union({1, 2, 3, 4, 5, 6, 6, 6})
print(set1)
Esto no es muy útil por si solo, ya que con esta sintaxis, set1 = {1, 1, 2, 3, 4, 4, 1, 2, 3, 4, 5, 6, 6, 6} puedo obtener el mismo resultado sin utilizar union().
{1, 2, 3, 4, 5, 6}
Pero si aplicamos su sintaxis para unir un set ya creado como el set 1 con un nuevo set, aquí sí que lo aprovechamos:
set1 = {1, 1, 2, 3, 4, 4}.union({1, 2, 3, 4, 5, 6, 6, 6})
set2 = set1.union({7, 8, 9})
print("Set 1:", set1)
print("Set 2:", set2)
Set 1: {1, 2, 3, 4, 5, 6}
Set 2: {1, 2, 3, 4, 5, 6, 7, 8, 9}
Union se puede escribir también de forma corta con la barra vertical:
set1 = {1, 1, 2, 3, 4, 4}.union({1, 2, 3, 4, 5, 6, 6, 6})
set2 = set1|({7, 8, 9})
Con intersection podemos obtener un set que contenga valores comunes en ambos sets.
set1 = {1, 1, 2, 3, 4, 4}.intersection({1, 2, 3, 4, 5, 6, 6, 6})
set2 = set1.intersection({7, 8, 9})
print("Set 1:", set1)
print("Set 2:", set2)
Set 1: {1, 2, 3, 4}
Set 2: set()
Tenemos también la forma abreviada de intersection. Se escribe con el símbolo ampersand.
set1 = {1, 1, 2, 3, 4, 4}&({1, 2, 3, 4, 5, 6, 6, 6})
set2 = set1.intersection({7, 8, 9})
print("Set 1:", set1)
print("Set 2:", set2)
Set 1: {1, 2, 3, 4}
Set 2: set()
Veamos otro ejemplo, ahora con strings.
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}
print(a & b)
print(b.intersection(a))
{'d'}
{'d'}
Se puede utilizar esto mismo por supuesto con union también.
Al contrario de sacar los comunes, podemos obtener los valores diferentes de cada set con difference.
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}
print(a.difference(b))
print(b.difference(a))
{'a', 'c', 'b'}
{'e', 'f', 'g'}
Podemos utilizar el símbolo "-" (menos) con el que hacemos las restas, en lugar de difference.
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}
print(a - b)
print(b - a)
{'a', 'c', 'b'}
{'e', 'f', 'g'}
"symmetric_difference" muestra los valores que no están repetidos en ninguno de los dos sets. Lo podemos escribir de las dos formas que ves en el print():
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}
print(a.symmetric_difference(b))
print(b - a)
{'g', 'a', 'f', {'g', 'f', 'e', 'a', 'b', 'c'}
Con issuperset comprobamos si el contenido de un set está en otro, ¡todo!, por lo que en este caso si tenemos los cuatro string del set a dentro de b, me devuelve False, y si no están todos en el set b, devuelve False.
Lo puedes escribir de las dos formas que ves en el print():
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}
print(a.issuperset(b))
print(b >= a)
False
False
En cambio, si incluyo estos strings, ahora si, me devuelve True en el set b, porqué todo el contenido del set a está repetido completamente en el set b.
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g','a', 'b', 'c'}
print(a.issuperset(b))
print(b >= a)
False
True
Con issubset hacemos lo contrario, en caso de que los valores del set a estén en el set b, devuelve True, en caso contrario, False.
isuperset e issubset hacen lo mismo, comprobar si todos los valores de un set están en otro, independientemente de si tienen otros valores más. La diferencia es que el True y el False, están invertidos.
Puedes escribirlo de las dos formas que ves en los print():
a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g','a', 'b', 'c'}
print(a.issubset(b))
print(b <= a)
True
False
isdisjoint devuelve True, si los valores de un set no están en el otro, si uno solo de ellos está, devuelve False.
a = {'a', 'b'}
b = {'d', 'e'}
print(a.isdisjoint(b))
True
a = {'a', 'b'}
b = {'d', 'e', 'a'}
print(a.isdisjoint(b))
False
Capítulo intenso y largo, que seguro que entiendes mucho mejor si ves el vídeo, ya que estas cosas es mejor ir probándolas para tener bien claro cómo funcionan.
Comentarios
Si te quedan dudas sobre el temario, sobre Python, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.