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