Sets en Python
Published: 2022-03-03 21:24:28

Los sets son una estructura de datos muy similares a las listas en cuanto a su forma, pero presentan ciertas características particulares:

**Los sets son mutables, solo contienen elementos inmutables no ordenados y no indexeables.**

Cada elemento del set es único, esto es que no se admiten duplicados, aun si durante la definición del set se agregan elementos repetidos pyhton solo guarda un elemento.

Los sets guardan los elementos en desorden y para declararlos se utilizan las llaves {}. 

```python
# set de enteros
my_set = {1, 3, 5}
print(my_set)

# set de diferentes tipos de datos
my_set = {1.0, "Hi", (1, 4, 7)}
print(my_set)
```

## Modificaciones de un set

Los sets no pueden ser leídos como las listas o recorridos a través de slices, esto debido a que no tienen un criterio de orden. Sin embargo si podemos agregar o eliminar items de los sets utilizando métodos:

- add(): nos permite agregar elementos al set, si se intenta agregar un elemento existente simplemente python los ignorara
- update(): nos permite agregar múltiples elementos al set
- remove(): permite eliminar un elemento del set, en el caso en que no se encuentre presente dicho elemento, Python elevará un error
- discard(): permite eliminar un elemento del set, en el caso en que no se encuentre presente dicho elemento, Python dejará el set intacto, sin elevar ningún error.
- pop(): borra aleatoriamente un elemento del set.
- clear(): Limpia completamente el set, dejándolo vació.

```python
#ejemplo de operaciones sobre sets 
my_set = {1, 2, 3} 
print(my_set) #Output {1, 2, 3} 

#añadiendo un elemento al set 
my_set.add(4) 
print(my_set) #Output {1, 2, 3, 4}

#añadiendo varios elementos al set, python ignorará elementos
#repetidos 
my_set.update([1, 5, 6]) 
print(my_set) #Output {1, 2, 3, 4, 5, 6}

# eliminado elementos del set 
my_set.discard(1) 
print(my_set) #Output {2, 3, 4, 5, 6}

# borrando un elemento aleatorio 
my_set.pop()
print(my_set) #Output el set menos un elemento aleatorio 

#limpiar el set 
my_set.clear()
print(my_set) # Output set()
```

## Creación de sets a partir de otras estructuras de datos

Podemos utilizar estructuras de datos existentes para transformarlas a sets utilizando el método set:

```python
#usando listas para crear sets
my_list = [1, 2, 3, 3, 4, 5]
my_set = set(my_list)
print(my_set)  #output {1, 2, 3, 4, 5}

#usando tuplas para crear sets 
my_tuple: ('hola', 'hola', 1, 2)
my_set2: set(my_tuple)
print(my_set2) #Output {'hola', 1}
```

## Operaciones con Sets

Se pueden realizar operaciones con dos sets (set1 y set2), algunas de ellas son:

#### Unión
Todos los elementos del set1 y set2.

```python
set1 = {3, 4, 5}
set2 = {5, 6, 7}

set3 = set1 | se2
print(set3)

# o utilizando el método unión
set3 = se1.union(set2)
```

```
{3, 4, 5, 6, 7}
```

### Intersección
Todos los elementos que tienen en común el set1 y set2.

```python
set1 = {3, 4, 5}
set2 = {5, 6, 7}

set3 = set1 & se2
print(set3)

# o utilizando el método intersection
set3 = set1.intersection(set2)
```

```
{5}
```
### Diferencia
De los dos sets, se quitan todos los elementos que comparte del otro set.

```python
set1 = {3, 4, 5}
set2 = {5, 6, 7}

set3 = set1 - se2
print(set3)

# o utilizando el método difference
set3 = set1.difference(set2)

set4 = set2.difference(set1)
print(set4)
```

```
{3, 4}
{6, 7}
```

### Diferencia simétrica
Se quedan los elementos que **NO** se comparten entre ambos sets.

```python
set1 = {3, 4, 5}
set2 = {5, 6, 7}

set3 = set1 ^ se2
print(set3)

# o utilizando el método difference
set3 = set1.symmetric_difference(set2)
```

```
{3, 4, 6, 7}
```