165 lines
4.7 KiB
Markdown
165 lines
4.7 KiB
Markdown
|
# Sets
|
||
|
|
||
|
Los sets son un tipo de dato para almacenar colecciones de datos
|
||
|
(collection data types: List, Tuple, Set, Dictionary)
|
||
|
|
||
|
set: desordenado, mutable, sin duplicados
|
||
|
|
||
|
Ejemplos:
|
||
|
- [Creación](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/04_sets#crear-set)
|
||
|
- [Operaciones sobre sets](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/04_sets#operaciones-sobre-sets)
|
||
|
- [set() por comprensión](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/04_sets#set-por-comprensi%C3%B3n)
|
||
|
- [unión, intersección y diferencia](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/04_sets#union-intersecci%C3%B3n-y-diferencia)
|
||
|
- [Copia](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/04_sets#copiar-sets)
|
||
|
- [frozenset()](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/04_sets#frozenset)
|
||
|
|
||
|
### Crear set
|
||
|
|
||
|
```python
|
||
|
# crear set con funcion set()
|
||
|
mi_set = set()
|
||
|
mi_set = set([1, 2, 3])
|
||
|
mi_set = set('hello') # {'l', 'o', 'h', 'e'}
|
||
|
```
|
||
|
### Operaciones sobre sets
|
||
|
```python
|
||
|
# añadir elmento add()
|
||
|
mi_set.add(16)
|
||
|
|
||
|
# remover elemento remove()
|
||
|
mi_set.remove(16)
|
||
|
# arroja excepcion KeyError si no existe
|
||
|
|
||
|
# remover elemento discard()
|
||
|
mi_set.discard(16)
|
||
|
# devuelve None si no existe
|
||
|
|
||
|
# vaciar set clear()
|
||
|
mi_set.clear()
|
||
|
|
||
|
mi_set = {1, 2, 3, 4}
|
||
|
|
||
|
# extraer un elemento con pop()
|
||
|
mi_set.pop()
|
||
|
# extracción arbitraria
|
||
|
|
||
|
# iterar set
|
||
|
for i in mi_set:
|
||
|
pass
|
||
|
|
||
|
# verificar existencia
|
||
|
if 2 in mi_set:
|
||
|
print('si')
|
||
|
```
|
||
|
----
|
||
|
|
||
|
> Nota Números Primos
|
||
|
> - son impares a excepción del primer primo '2'
|
||
|
> - no terminan en '0' o numero par
|
||
|
> - no terminan en '5' a excepción del '5'
|
||
|
>
|
||
|
> Regla general: todo número divisible solo por 1 y por si mismo.
|
||
|
-----
|
||
|
|
||
|
### set() por comprensión
|
||
|
```python
|
||
|
impares = set([x for x in range(1, 10, 2)])
|
||
|
pares = set([x for x in range(0, 10, 2)])
|
||
|
# impares: {1, 3, 5, 7, 9}
|
||
|
# pares: {0, 2, 4, 6, 8}
|
||
|
|
||
|
# comprension de set condicional
|
||
|
frase = "hola a todas las personas"
|
||
|
|
||
|
vocales_unicas = {i for i in frase if i in 'aeiou'}
|
||
|
# {'e', 'a', 'o'}
|
||
|
|
||
|
primos = set([2, 3, 5, 7])
|
||
|
```
|
||
|
|
||
|
### union, intersección y diferencia
|
||
|
```python
|
||
|
primos = set([2, 3, 5, 7])
|
||
|
|
||
|
# union, intersección, y diferencia de sets
|
||
|
# estos no modifican los sets originales, si no q retornan un nuevo set
|
||
|
|
||
|
# union: combina elementos entre 2 sets sin duplicados
|
||
|
u = impares.union(pares) # u = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
|
||
|
|
||
|
# intersección: contempla solo los elementos encontrados en ambos sets
|
||
|
i = primos.intersection(pares) # i = {2}
|
||
|
|
||
|
# diferencia: contempla solo los elementos del primer set,
|
||
|
# que no se encuentran el el segundo
|
||
|
dif = u.difference(primos) # dif = {0, 1, 4, 6, 8, 9}
|
||
|
dif = u.difference(impares) # dif = {0, 2, 4, 6, 8}
|
||
|
dif = u.difference(pares) # dif = {1, 3, 5, 7, 9}
|
||
|
|
||
|
# diferencia simetrica: combina los elementos únicos entre ambos sets
|
||
|
dif_s = primos.symmetric_difference(pares) # dif = {0, 3, 4, 5, 6, 7, 8}
|
||
|
dif_s = primos.symmetric_difference(impares) # dif = {1, 2, 9}
|
||
|
dif_s = u.symmetric_difference(primos) # dif = {0, 1, 4, 6, 8, 9}
|
||
|
|
||
|
# update(), intersection_update(),
|
||
|
# difference_update() y symmetric_difference_update()
|
||
|
# escriben los cambios en el set
|
||
|
|
||
|
# update set
|
||
|
impares.update(primos) # impares = {1, 2, 3, 5, 7, 9}
|
||
|
|
||
|
# intersection_update()
|
||
|
u.intersection_update(pares) # u = {0, 2, 4, 6, 8}
|
||
|
|
||
|
# difference_update()
|
||
|
u.difference_update(impares) # u = {0, 4, 6, 8}
|
||
|
|
||
|
# symmetric_difference_update()
|
||
|
u.symmetric_difference_update(dif_s) # u = {1, 9}
|
||
|
|
||
|
# issubset(), retorna True si el set que llama al metodo
|
||
|
# es un sub-set del set pasado como argumento
|
||
|
u.issubset(impares) # True
|
||
|
|
||
|
# issuperset(), retorna True si el set pasado como argumento
|
||
|
# es un sub-set del set que llama al metodo
|
||
|
impares.issuperset(u) # True
|
||
|
|
||
|
# isdisjoint(), retorna True si el set que llama al metodo no tiene
|
||
|
# ningun elemento que coincida con los del set pasado como argumento
|
||
|
u.isdisjoint(pares) # True
|
||
|
```
|
||
|
|
||
|
### Copiar sets
|
||
|
```python
|
||
|
# esta asignación hace referencia al mismo punto en memoria
|
||
|
copia_set = pares
|
||
|
# cualquier cambio en copia_set modfica el set pares.
|
||
|
|
||
|
# copiar con copy()
|
||
|
copia_set = pares.copy()
|
||
|
|
||
|
# copiar con set()
|
||
|
copia_set = set(pares)
|
||
|
```
|
||
|
|
||
|
### frozenset()
|
||
|
```python
|
||
|
# frozenset(), es otro 'collection data type',
|
||
|
# es identico al set, salvo que es inmutable
|
||
|
|
||
|
mi_frozenset = frozenset([x for x in range(1, 101)])
|
||
|
|
||
|
try:
|
||
|
msg = mi_frozenset.add(101)
|
||
|
except AttributeError as AE:
|
||
|
# msg = AE.__str__()
|
||
|
msg = str(AE)
|
||
|
try:
|
||
|
msg = mi_frozenset.remove(1)
|
||
|
except AttributeError as AE:
|
||
|
msg += '\n' + AE.__str__()
|
||
|
finally:
|
||
|
print(f'frozenset es inmutable\n{msg}')
|
||
|
```
|