Sets con Python

La estructura set en Python es un tipo de datos para conjuntos que permite que se puedan almacenar diferentes elementos en una variable.

Conjuntos set en Python

¿A qué se refiere esta definición con conjuntos de Python? Los conjuntos son colecciones desordenadas sin elementos duplicados.

  • Colección desordenada.
  • Inalterable.
  • No indexada.

En este ejemplo vamos a crear un conjunto con algunos elementos duplicados y cuando imprimamos en pantalla el conjunto veremos que desaparecen.

conjunto = {1, 2, 3, 3, 3, 4, 5, 6}

print(type(conjunto))
# <class 'set'>

print(len(conjunto))
# 6

print(conjunto)
# {1, 2, 3, 4, 5, 6}

Los conjuntos o sets en Python no son indexables.

conjunto = {1, 2, 3, 3, 3, 4, 5, 6}
print(conjunto[1])

# TypeError: 'set' object is not subscriptable

Constructor set() en Python

Podemos crear una colección haciendo uso de la función set() en Python. Si lo creamos sin doble paréntesis, únicamente admite un argumento string como valor para colección.

conjunto = set('Badajoz')
print(conjunto)

# {'o', 'd', 'a', 'j', 'B', 'z'}

Las colecciones nos permiten agregar más elementos mediante el constructor haciendo uso del doble paréntesis, como pasaba con las listas de Python y las tuplas.

conjunto = set(('Badajoz', 'Cáceres', 'Barbate'))
print(conjunto)

# {'Badajoz', 'Cáceres', 'Barbate'}

Si queremos crear un conjunto vacío, debemos hacerlo con paréntesis en vez de con llaves, pues, si lo creamos con llaves, estaremos creando un diccionario.

conjunto = set()
print(type(conjunto))
# <class 'set'>

conjunto = set{}
print(type(conjunto))

Agregar y eliminar elementos

En las colecciones podemos agregar elementos mediante el método add() y eliminarlos utilizando los métodos remove() y discard(). Debemos conocer siempre el elemento a eliminar, ya que no existe la posibilidad de eliminarlo mediante su índice.

Vamos a crear un conjunto vacío al que le añadiré dos elementos.

conjunto = set()
conjunto.add('elemento')
conjunto.add('otro elemento')

print(type(conjunto))
# <class 'set'>

print(conjunto)
# {'elemento', 'otro elemento'}

Ahora vamos a eliminar con el método remove() de Python uno de los dos elementos haciendo referencia al propio elemento.

conjunto = set(('elemento', 'otro elemento'))
print(conjunto)
# {'elemento', 'otro elemento'}

conjunto.remove('elemento')
print(conjunto)
# {'otro elemento'}

Eliminaremos ahora un elemento de nuestra colección haciendo uso del método discard() para Python.

conjunto = set(('elemento', 'otro elemento'))
print(conjunto)
# {'elemento', 'otro elemento'}

conjunto.discard('elemento')
print(conjunto)
# {'otro elemento'}

Como pasaba con las listas de Python, podemos hacer uso del método clear() y de la palabra clave del para eliminar la colección. Hay que tener en cuenta que con clear() estaremos vaciando la colección, pero esta seguirá existiendo; con la palabra clave del, se eliminará la colección completamente.

En este ejemplo vamos a crear una colección y la vaciaremos haciendo uso de clear() en Python.

conjunto = {1, 2, 3, 4, 5, 6}
print(conjunto)
# {1, 2, 3, 4, 5, 6}

conjunto.clear()
print(conjunto)
# set()

Ahora eliminaremos nuestra colección utilizando  palabra clave del para Python.

conjunto = {1, 2, 3, 4, 5, 6}
print(conjunto)
# {1, 2, 3, 4, 5, 6}

del conjunto
print(conjunto)
# NameError: name 'conjunto' is not defined

Recorrer colección con Python

Para recorrer las colecciones podemos utilizar las estructuras for y for Comprehensions.

conjunto = {1, 2, 3, 4, 5, 6}
for numero in conjunto:
    print(numero, end=', ')

# 1, 2, 3, 4, 5, 6,

Recorriendo una colección mediante un for Comprehensions

En este ejemplo crearemos una nueva colección con el valor de la colección original multiplicado por 10.

conjunto = {1, 2, 3, 4, 5, 6}
nuevo_conjunto = {numero*10 for numero in conjunto}
print(nuevo_conjunto)

# {40, 10, 50, 20, 60, 30}

Recuerda que recorriendo mediante Comprehensions podemos hacer uso de condicionales. Para este ejemplo, crearemos un nuevo conjunto con los valores resultantes de multiplicar por 10 los valores pares de la colección original.

conjunto = {1, 2, 3, 4, 5, 6}
nuevo_conjunto = {numero*10 for numero in conjunto if numero%2 == 0}
print(nuevo_conjunto)

# {40, 20, 60}

Uniendo varias colecciones

Las colecciones se pueden unir de dos formas distintas: una es manteniendo cada colección en su estado original y generando una nueva para la unión; otra, directamente modificando una de las colecciones para agregarle los elementos de la otra.

  • Método union() para sets en Python.
  • Método update() para sets en Python.

Veamos un ejemplo con cada tipo:

conjunto = {1, 2, 3, 4, 5, 6}
conjunto_dos = {7, 8, 9, 10}
nuevo_conjunto = conjunto.union(conjunto_dos)

print(nuevo_conjunto)
# {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

print(conjunto)
# {1, 2, 3, 4, 5, 6}
conjunto = {1, 2, 3, 4, 5, 6}
conjunto_dos = {7, 8, 9, 10}

conjunto.update(conjunto_dos)
print(conjunto)
# {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Comparando el contenido de los sets

Existe la posibilidad de comparar el contenido de varias colecciones de forma muy sencilla.

conjunto = {'Badajoz', 'Cáceres', 'Barbate'}
conjunto_dos = {'Barbate', 'Cádiz', 'Zahora'}

print(conjunto - conjunto_dos)
# {'Badajoz', 'Cáceres'}

print(conjunto | conjunto_dos)
# {'Zahora', 'Cádiz', 'Barbate', 'Badajoz', 'Cáceres'}

print(conjunto & conjunto_dos)
# {'Barbate'}

print(conjunto ^ conjunto_dos)
# {'Cádiz', 'Cáceres', 'Zahora', 'Badajoz'}

Si necesitamos mantener los elementos de nuestras colecciones que están presentes en los dos conjuntos, podemos usar el método intersection_update() de Python.

No podemos olvidar que update actualizará nuestra colección original.

conjunto = {'Badajoz', 'Cáceres', 'Barbate'}
conjunto_dos = {'Barbate', 'Cádiz', 'Zahora'}
conjunto.intersection_update(conjunto_dos)
print(conjunto)

# {'Barbate'}

Si no queremos modificar nuestra colección original, podemos hacer uso del método intersection() sin el update.

conjunto = {'Badajoz', 'Cáceres', 'Barbate'}
conjunto_dos = {'Barbate', 'Cádiz', 'Zahora'}
nuevo_conjunto = conjunto.intersection(conjunto_dos)

print(nuevo_conjunto)
# {'Barbate'}

print(conjunto)
# {'Badajoz', 'Cáceres', 'Barbate'}

Si para nuestro programa necesitásemos actualizar alguna colección con los elementos que no estén repetidos en ambas colecciones, utilizaremos el método symmetric_difference_update().

conjunto = {'Badajoz', 'Cáceres', 'Barbate'}
conjunto_dos = {'Barbate', 'Cádiz', 'Zahora'}
conjunto.symmetric_difference_update(conjunto_dos)
print(conjunto)

# {'Cádiz', 'Cáceres', 'Zahora', 'Badajoz'}

De la misma forma que con intersection, si del método symmetric_difference() eliminamos el update, estaríamos creando un conjunto nuevo con los elementos que no están presentes en ambas colecciones.

conjunto = {'Badajoz', 'Cáceres', 'Barbate'}
conjunto_dos = {'Barbate', 'Cádiz', 'Zahora'}
nuevo_conjunto = conjunto.symmetric_difference(conjunto_dos)

print(nuevo_conjunto)
# {'Cádiz', 'Cáceres', 'Zahora', 'Badajoz'}

print(conjunto)
# {'Badajoz', 'Cáceres', 'Barbate'}

Puedes conocer más información sobre sets en Python en su documentación oficial.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *