Curso de Python avanzado

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.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.