Explicación del uso de estructuras de datos tipo conjuntos en Python 3.
Conjunto
Ahora, es el turno de los conjuntos. Éstos son una estructura sin orden que no admiten múltiples ocurrencias de un mismo elemento. Pueden ser definidos a partir de una lista con la función set(), o bien, los elementos del conjunto pueden ir entre llaves, {}, y estar separados por comas.
Los conjuntos son:
hetereogéneos: los elementos pueden ser de distinto tipo en un mismo conjunto
nomutables: los elementos no pueden ser modifcados una vez el conjunto ha sido creado
Los conjuntos pueden construirse con la función set() o directamente entre llaves, {}.
Observación. Al decir que los conjuntos no tienen orden, lo que ocurre es que Python no mantendrá el que hemos introducido, tal y como hacía con las listas, sino que reordenará todos los elementos por orden primero numérico (yendo antes los negativos que los positivos) y luego alfabético de las claves. Con la función print(), el conjunto no se ordena correctamente.
Por lo que hemos visto hasta ahora, podemos decir que los conjuntos en Python son fieles a la definición matemática de éstos, salvo por el hecho de que en Pythonun conjunto no puede contener como elemento a otro conjunto:
Conjunto. Colección de elementos pertenecientes a la misma categoría, y cuya agrupación puede ser considerada o identificada en sí misma como un objeto. Un conjunto queda definido únicamente por sus elementos y por nada más. En particular, un conjunto puede escribirse como una lista de elementos, pero cambiar el orden de dicha lista o añadir elementos repetidos no define un conjunto nuevo.
Subconjuntos
Subconjunto. Un subconjunto B de un conjunto A es un conjunto que contiene algunos de los elementos de A (o quizá todos). Se denota por B⊆A
Subconjunto propio. Un subconjunto propio B de un conjunto A es un conjunto que tiene algunos de los elementos de A, pero no todos. Se denota por B ⊂ A
Para saber si un conjunto B es subconjunto del conjunto A, podemos utilizar el método .issubset() o el comparador <=. Para saber si se trata de un subconjunto propio, tenemos el comparador <.
A, B ={0,3,7,2,5},{2,3,0}B.issubset(A)#RESPUESTATrue
B <= A#RESPUESTATrue
B < A#RESPUESTATrue
Superconjunto. Un superconjunto A de un conjunto B es un conjunto que contiene a B. Se denota por A ⊇ B
Superconjunto propio. Un superconjunto propio A de un conjunto $ es un conjunto que contiene a B y consta de al menos un elemento más. Se denota por A ⊃ B
Para saber si un conjunto A es superconjunto del conjunto B, podemos utilizar el método .issuperset() o el comparador >=. Para saber si se trata de un superconjunto propio, tenemos el comparador >.
A, B ={0,3,7,2,5},{2,3,0}A.issuperset(B)#RESPUESTATrue
A >= B#RESPUESTATrue
A > B#RESPUESTATrue
Ojo: ¡Pero no todos los conjuntos son siempre subconjunto o superconjunto unos de otros!
X ={1,2,3}Y ={'a','b','c'}
X <= Y#RESPUESTAFalse
X >= Y#RESPUESTAFalse
Operaciones con conjuntos
Dados los conjuntos A y B, vamos a ver una serie de operaciones que podemos hacer con ellos.
Unión. La unión de dos conjuntos A y B es un nuevo conjunto A ∪ B que contiene todos los elementos de A y/o todos los de B. En Python, la unión de dos conjuntos se consigue con la función | o bien, con el método .union()
A, B ={1,3,5,7,9},{0,2,4,6,8}A | B#RESPUESTA{0,1,2,3,4,5,6,7,8,9}
A.union(B)#RESPUESTA{0,1,2,3,4,5,6,7,8,9}
B.union(A)#RESPUESTA{0,1,2,3,4,5,6,7,8,9}
Intersección. La intersección entre dos conjuntos A y B es un nuevo conjunto A ∩ B que contiene todos los elementos comunes de A y B.
En Python, la intersección de dos conjuntos se consigue con la función & o bien, con el método .intersection()
A, B ={0,1,3,5,8,13},{0,2,4,6,8}A & B#RESPUESTA{0,8}
A.intersection(B)#RESPUESTA{0,8}
B.intersection(A)#RESPUESTA{0,8}
Diferencia. La diferencia entre dos conjuntos A y B es un nuevo conjunto A - B que contiene todos los elementos de A que no están en B
En Python, la diferencia de dos conjuntos se consigue con la función - o bien, con el método .difference()
A, B ={0,1,4,5,8,13},{0,3,4,7,8}A - B#RESPUESTA{1,5,13}
A.difference(B)#RESPUESTA{1,5,13}
B.difference(A)#RESPUESTA{3,7}
Diferencia simétrica. La diferencia entre dos conjuntos A y B es un nuevo conjunto A Δ B que contiene todos los elementos de A ∪ B no están en A ∩ B
A△B=(A∪B)−(A∩B)=(A−B)∪(B−A)
En Python, la diferencia simétrica de dos conjuntos se consigue con el método .symmetric_difference()
A, B ={0,1,4,5,8,13},{0,3,4,7,8}A.symmetric_difference(B)#RESPUESTA{1,3,5,7,13}
(A-B) | (B-A)#RESPUESTA{1,3,5,7,13}
(A | B) - (A & B)#RESPUESTA{1,3,5,7,13}
Elementos de un conjunto
Podemos añadir un elemento a un conjunto con el método .add()
Observación. Si intentamos eliminar un elemento que no existe ya de por sí en el conjunto con el método .remove(), Python nos devolverá error, mientras que con el método .discard() no devolverá ningún error.
Tamaño de un conjunto
Para saber cuántos elementos contiene un conjunto, podemos usar la función len()del siguiente modo:
Vamos a pedirle al usuario una frase y vamos a guardar en un conjunto las letras que aparecen en dicha frase.
print("+ A continuación debe escribir una frase")s =str(input("+ Su frase: "))set1 =set()for i in s.lower():if i !=" ": set1.add(i)print(set1)
#RESPUESTA
+ A continuación debe escribir una frase
+ Su frase: a hierro muere
{'h', 'm', 'u', 'r', 'o', 'a', 'i', 'e'}
EJERCICIO 2:
Vamos a pedirle al usuario dos palabras y vamos a calcular la intersección de las letras de cada palabra. Para ello habrá que crear dos conjuntos que contendrán, respectivamente, las letras que forman cada palabra.
print("+ Escriba dos palabras: ")word1 =str(input("+ Palabra 1: "))set1 =set()for c in word1:if c !=" ": set1.add(c)word2 =str(input("+ Palabra 2: "))set2 =set()for i in word2:if i !=" ": set2.add(i)print(set1.intersection(set2))
Vamos a pedirle 4 números enteros al usuario. Se corresponderán con los extremos de los intervalos [a,b] y [c,d] . Vamos a generar dos conjuntos que guarden, respectivamente, los enteros contenidos en cada uno de los intervalos (incluyendo los extremos) y, finalmente, calcularemos la diferencia simétrica.
#RESPUESTA
+ Introduzca 4 números enteros:
Número 1: 1
Número 2: 3
Número 3: 2
Número 4: 4
{1, 4}
EJERCICIO 4:
Vamos a guardar en un conjunto los números primos comprendidos entre 2 y el número n que nos indique el usuario mediante la criba de Eratóstenes.
n =int(input("Introduce un número entero mayor que 2: "))primes =set(range(2, n +1))numbers =list(range(2, n +1))multiples = [Truefor x inrange(len(numbers))]for i inrange(len(numbers)):if multiples[i]==False:continuefor j inrange(i +1, len(numbers)):if numbers[j]% numbers[i]==0: multiples[j]=False primes.discard(numbers[j])print(primes)
EJERCICIO 5:
Vamos a crear un programa que nos devuelva el elemento máximo de un conjunto sin utilizar la función max().
myset ={20,3,5,10,9,30,-5,30}max=-99999for i in myset:if i >max:max= iprint(max)#RESPUESTA30
REPASO
#EJERCICIO 1: Dado un número entero introducido por teclado, guarda sus divisores en un conjunto y muéstralon =int(input("Introduzca un número: "))divisores =set()for i inrange(1, n +1):if n % i ==0: divisores.add(i)print(divisores)
#RESPUESTA
Introduzca un número: 10
{1, 2, 10, 5}
#EJERCICIO 2: Crea un programa que dado un conjunto, nos devuelva su mínimo. Debes hacerlo sin recurrir a la función min().myset ={20,3,5,10,9,30,-5,30}min=9999for i in myset:if i <min:min= iprint(min)#RESPUESTA-5
#EJERCICIO 3:Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que empiecen por la letra indicada por el usuario.print("Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que empiecen por la letra indicada por el usuario.")s =str(input("Introduce una frase: "))l =str(input("Introduce una letra: "))s = s.lower()palabras =set()for word in s.split():if word[0]== l.lower(): palabras.add(word)print(palabras)
#RESPUESTA
Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que empiecen por la letra indicada por el usuario.
Introduce una frase: Hola me llamo hector
Introduce una letra: h
{'hector', 'hola'}
#EJERCICIO 4: Dado un conjunto, crea un programa que nos devuelva el caracter con mayor valor ASCII. Debes hacerlo sin recurrir a la función max().myset ={"a","e","i","o","u"}max=-9999for i in myset:iford(i)>max:max=ord(i)print(chr(max))#RESPUESTAu
#EJERCICIO 5: Dado un conjunto, crea un programa que nos devuelva el caracter con menor valor ASCII. Debes hacerlo sin recurrir a la función min().myset ={"a","e","i","o","u"}min=9999for i in myset:iford(i)<min:min=ord(i)print(chr(min))#RESPUESTAa
#EJERCICIO 6: Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que contengan la letra indicada por el usuario.print("Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que contengan la letra indicada por el usuario.")s =str(input("Introduce una frase: "))l =str(input("Introduce una letra: "))s = s.lower()palabras =set()for word in s.split():for c in word:if c == l.lower(): palabras.add(word)print(palabras)
#RESPUESTA
Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que contengan la letra indicada por el usuario.
Introduce una frase: supercalifragilistico
Introduce una letra: a
{'supercalifragilistico'}
#EJERCICIO 7: Dada una frase introducida por teclado, guarda en un conjunto la primera letra de cada palabra sin hacer uso del método .split().print("Dada una frase introducida por teclado, guarda en un conjunto la primera letra de cada palabra sin hacer uso del método .split().")s =str(input("Introduce una frase: "))s = s.strip()letras =set(s[0])for c inrange(len(s)):if s[c]==" ": letras.add(s[c +1])print(letras)
#RESPUESTA
Dada una frase introducida por teclado, guarda en un conjunto la primera letra de cada palabra sin hacer uso del método .split().
Introduce una frase: Hola me llamo enrique
{'H', 'm', 'e', 'l'}
#EJERCICIO 8: Dada una frase introducida por teclado, guarda en un conjunto todas las palabras con longitud par.print("Dada una frase introducida por teclado, guarda en un conjunto todas las palabras con longitud par.")s =str(input("Introduce una frase: "))s = s.lower()pares =set()for word in s.split():iflen(word)%2==0: pares.add(word)print(pares)
#RESPUESTA
Dada una frase introducida por teclado, guarda en un conjunto todas las palabras con longitud par.
Introduce una frase: Hola me llamo enrique
{'me', 'hola'}
#EJERCICIO 9: Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que acaben por la letra indicada por el usuario.print("Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que acaben por la letra indicada por el usuario.")s =str(input("Introduce una frase: "))l =str(input("Introduce una letra: "))s = s.lower()palabras =set()for word in s.split():if word[-1]== l: palabras.add(word)print(palabras)
#RESPUESTA
Dada una frase introducida por teclado, guarda en un conjunto todas las palabras que acaben por la letra indicada por el usuario.
Introduce una frase: Hola me llamo enriqueta
Introduce una letra: a
{'enriqueta', 'hola'}
#EJERCICIO 10: Dada una frase introducida por teclado, guarda en un conjunto todas las palabras palíndromas.print("Dada una frase introducida por teclado, guarda en un conjunto todas las palabras palíndromas")s =str(input("Introduce una frase: "))s = s.lower()palindromas =set()for word in s.split():if word == word[::-1]: palindromas.add(word)print(palindromas)
#RESPUESTA
Dada una frase introducida por teclado, guarda en un conjunto todas las palabras palíndromas
Introduce una frase: Aba hecho Anana arañara peso
{'anana', 'arañara', 'aba'}