Operaciones con sets - Python avanzado - Capítulo 9


Buscar elementos en un set de Python

Podemos saber o buscar un elemento en un set con una sintaxis extremadamente corta:

Código

a = {'a', 'b'}

print('a' in a)

Resultado

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.

Código

a = {1, 2}

print(3 not in a)

Resultado

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.

Código

a = {1, 2}

a.remove(1)

print(a)

Resultado

Se ha eliminado correctamente el valor 1 y nos queda solo el valor 2.

{2}

Lo mismo podemos hacer con discard.

Código

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.

Código

a = {1, 2}

a.remove(1)
a.remove(1)

print(a)

Resultado

Sencillamente, devuelve un error de clave (KeyError), ya que no la encuentra.

 Traceback (most recent call last):
  File "Ruta del archivo", line X, in 
    a.remove(1)
KeyError: 1

En cambio a discard, esto le da igual, ignora el fallo:

Código

a = {1, 2}

a.discard(1)
a.discard(1)

print(a)

Resultado

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

Podemos añadir nuevos elementos a un set con add():

Código

a = {1, 2}

a.add(3)
print(a)

Resultado

{1, 2, 3}

Si quieres añadir varios elementos de una sola vez, Puedes utilizar update().

Código

a = {1, 2}

a.add({3, 4, 5, 6})

print(a)

Resultado

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

Podemos unir dos sets con union.

Código

set1 = {1, 1, 2, 3, 4, 4}.union({1, 2, 3, 4, 5, 6, 6, 6})

print(set1)

Resultado

Esto no es muy útil por si solo, ya que con esta sintáxis, 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:

Código

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)

Resultado

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:

Código

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.

Código

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)

Resultado

Set 1: {1, 2, 3, 4}
Set 2: set()

Tenemos también la forma abreviada de intersection. Se escribe con el símbolo ampersand.

Código

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)

Resultado

Set 1: {1, 2, 3, 4}
Set 2: set()

Veamos otro ejemplo, ahora con strings.

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}

print(a & b)

print(b.intersection(a))

Resultado

{'d'}
{'d'}

Podemos 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.

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}

print(a.difference(b))

print(b.difference(a))

Resultado

{'a', 'c', 'b'}
{'e', 'f', 'g'}

Podemos utilizar el símbolo "-" (menos) con el que hacemos las restas, en lugar de difference.

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}

print(a - b)
print(b - a)

Resultado

{'a', 'c', 'b'}
{'e', 'f', 'g'}

simetric diference 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():

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}

print(a.symmetric_difference(b))
print(b - a)

Resultado

{'g', 'a', 'f', 'e', 'b', 'c'}
{'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():

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g'}

print(a.issuperset(b))
print(b >= a)

Resultado

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.

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g','a', 'b', 'c'}

print(a.issuperset(b))
print(b >= a)

Resultado

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 isubset 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():

Código

a = {'a', 'b', 'c', 'd'}
b = {'d', 'e', 'f', 'g','a', 'b', 'c'}

print(a.issubset(b))
print(b <= a)

Resultado

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.

Código

a = {'a', 'b'}
b = {'d', 'e'}

print(a.isdisjoint(b))

Resultado

True

Código

a = {'a', 'b'}
b = {'d', 'e', 'a'}

print(a.isdisjoint(b))

Resultado

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.


Suscríbete a mi canal de YouTube para apoyarme

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.


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.