Apuntes_Python/02_conceptos/04_sets/README.md

4.6 KiB

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:

Crear set

# 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

# 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

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

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

# 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()

# 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}')