Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Laboratorio N° 02
OBJETIVOS
II
TEMAS A TRATAR
Conjuntos
Relaciones
Paquetes Python para relaciones
III
MARCO TEÓRICO
cuyos elementos son los enteros pares positivos. Observe que para denotar un miembro
del conjunto se usa una letra, casi siempre x; la recta vertical | se lee “tal que” y la
coma “y”.
Mas Ejemplos:
El conjunto A anterior también se escribe como A = {x | x es un entero positivo impar,
x < 10}.
Aunque no es posible listar todos los elementos del conjunto B anterior, a este
conjunto se le especifica como B = {2, 4, 6, . . .} donde se supone que todo mundo lo
entiende. Observe que 8 ∈ B, pero 3 ∉ B.
1. SUBCONJUNTOS
Se presentan varias operaciones con conjuntos, como son las operaciones básicas de
unión, intersección y complemento.
Recuerde que todos los conjuntos a considerar en un momento particular son subconjuntos de
un conjunto universo fijo U. El complemento absoluto o, simplemente, el complemento de un
conjunto A, denotado por AC, es el conjunto de elementos que pertenecen a U, pero que no
pertenecen a A. Es decir, AC = {x | x ∈ U, x ∉ A. }En algunos textos el complemento de A se
̅ . La figura 2a) es un diagrama de Venn en el que AC está sombreado.
denota por A’ o 𝐴
El complemento relativo de un conjunto B respecto de un conjunto A o, simplemente, la
diferencia de A y B, denotada por A\B, es el conjunto de elementos que pertenecen a A pero
que no pertenecen a B; es decir,A\B = {x | x ∈ A, x ∉ B}. El conjunto A\B se lee “A menos
B”. En muchos textos la expresión A\B aparece como A − B o como A ∼ B. La figura 2b) es
un diagrama de Venn en el que A\B está sombreada.
La diferencia simétrica de los conjuntos A y B, denotada por A ⊕ B, consta de los elementos
que pertenecen a A o a B pero no a ambos. Es decir,A ⊕ B = (A ∪ B)\(A ∩ B) o A ⊕ B =
(A\B) ∪ (B\A)
La figura 2c) es un diagrama de Venn en el que A ⊕ B está sombreada.
IV
ACTIVIDADES
1. Conjuntos en Python:
print("banana" in thisset)
Intercambiando items:
thisset.add("orange")
print(thisset)
Longitud de un Conjunto:
print(len(thisset))
thisset.remove("apple")
print(thisset)
thisset.discard("banana")
print(thisset)
x = thisset.pop()
print(x)
print(thisset)
Borrando elementos:
thisset.clear()
print(thisset)
del thisset
print(thisset)
set()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-17-b99874a4d6ea> in <module>()
3
4 del thisset
----> 5 print(thisset)
Constructor de conjuntos:
set3 = set1.union(set2)
print(set3)
set3.update(set4)
print(set3)
Method Description
difference() Returns a set containing the difference between two or more sets
difference_update() Removes the items in this set that are also included in another, specified set
intersection_update() Removes the items in this set that are not present in other, specified set(s)
symmetric_difference_update() inserts the symmetric differences from this set and another
update() Update the set with the union of this set and others
2. Relaciones en Python:
def is_reflexive(relation,X):
for i in X:
if (i,i) not in relation:
return False
return True
X = {1,2,3}
relations = {(1,2),(1,3),(2,3),(2,1),(2,2),(3,2),(3,3),(1,1),(3,1)}
print("Es reflexiva? ",is_reflexive(relations,X))
def is_symmetric(relations):
for a,b in relations:
if (b,a) not in relations:
return False
return True
def is_symmetric2(relation):
# checks symmetric property: (a, b) -> (b, a)
return all(rel[::-1] in relation for rel in relation)
def is_transitive(relation):
for a, b in relation:
for c, d in relation:
# checks transitive property: (a, b) && (b, c) -> (a, c)
if b == c and (a,d) not in relation:
return False
return True
def check_relation(relation):
return is_symmetric(relation) and is_transitive(relation)
Is symmetric? False
Is transitive? False
Is both? False
Is symmetric? True
Is transitive? False
Is both? False
Is symmetric? True
Is transitive? True
Is both? True
def is_antisymmetric(relations):
for a,b in relations:
if a==b:
continue
if (b,a) in relations:
return False
return True
rel2 = {('a','a'),('b','c'),('d','d'),('b','b'),('c','c')}
print("Es antisimétrica? ",is_antisymmetric(relations))
print("Es antisimetrica la rel2? ",is_antisymmetric(rel2))
def is_partialOrder(relations,X):
return is_reflexive(relations,X) and is_antisymmetric(relations) and
is_transitive(relations)
def inverse(relations):
rpta = set()
for a,b in relations:
rpta.add((b,a))
return rpta
rel3 = {(1,2),(4,5)}
inv = inverse(rel3)
print("La relacion inversa es ",inv)
# Function to add 2
def add(x):
return x + 2
# Function to multiply 2
def multiply(x):
return x * 2
# Function to add 2
def add(x):
return x + 2
# Function to multiply 2
def multiply(x):
return x * 2
# Function to subtract 2
def subtract(x):
return x - 1
Ahora modifiquemos nuestra funcion de composición a una que puede componer cualquier
cantidad de funciones en vez de usar las dos; usando reduce() de la librería functools.
# composite_function accepts N
# number of function as an
# argument and then compose them
def composite_function(*func):
# Function to add 2
def add(x):
return x + 2
# Function to multiply 2
def multiply(x):
return x * 2
# Function to subtract 2
def subtract(x):
return x - 1
import numpy as np
import networkx as nx
import scipy.stats as stats
import scipy.sparse as sparse
[]
[4, 0, 5]
[4, 0, 5]
[4, 0, 5, 0]
[4, 0, 5, 0, 0, 5]
[4, 0, 5, 0, 0, 5, 0]
indptr: [0, 0, 3, 3, 4, 6, 7]
data: [1 1 1 1 1 1 1]
A:
(1, 1) 1
(1, 4) 1
(3, 0) 1
(4, 0) 1
(4, 5) 1
(5, 0) 1
(5, 5) 1
A_trans:
(1, 5) 1
(1, 0) 1
(1, 4) 2
(1, 1) 1
(3, 0) 2
(4, 5) 2
(4, 0) 2
(5, 5) 1
(5, 0) 2
Transitiva y Reflexiva:
(1, 1) 1
(1, 4) 1
(3, 0) 1
(4, 0) 1
(4, 5) 1
(5, 0) 1
(5, 5) 1
(1, 4) 1
(1, 0) 1
(1, 5) 1
(3, 0) 1
(4, 0) 1
(4, 5) 1
(5, 0) 1
import numpy as np
import scipy.stats as stats
import scipy.sparse as sparse
import itertools
nonzeros = []
for k in range(components[0]):
idx = np.where(components[1] == k)[0]
nonzeros.extend(itertools.product(idx, idx))
row = tuple(r for r, c in nonzeros)
col = tuple(c for r, c in nonzeros)
data = np.ones_like(row)
B = sparse.coo_matrix((data, (row, col)), shape=A.shape)
print(B, "\n\n")
print(B.toarray())
(0, 0) 1
(1, 1) 1
(2, 2) 1
(3, 3) 1
(4, 4) 1
(4, 11) 1
(11, 4) 1
(11, 11) 1
(5, 5) 1
(5, 6) 1
(5, 7) 1
(5, 9) 1
(5, 13) 1
(5, 14) 1
(6, 5) 1
(6, 6) 1
(6, 7) 1
(6, 9) 1
(6, 13) 1
(6, 14) 1
(7, 5) 1
(7, 6) 1
(7, 7) 1
(7, 9) 1
(7, 13) 1
: :
(9, 9) 1
(9, 13) 1
(9, 14) 1
(13, 5) 1
(13, 6) 1
(13, 7) 1
(13, 9) 1
(13, 13) 1
(13, 14) 1
(14, 5) 1
(14, 6) 1
(14, 7) 1
(14, 9) 1
(14, 13) 1
(14, 14) 1
(8, 8) 1
(10, 10) 1
(10, 18) 1
(18, 10) 1
(18, 18) 1
(12, 12) 1
(15, 15) 1
(16, 16) 1
(17, 17) 1
(19, 19) 1
[[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0]
[0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]]
EJERCICIOS
1. Conjuntos:
a) Los conjuntos son listas sin entradas duplicadas. Supongamos que quieres
recopilar una lista de palabras usadas en un párrafo;
Esto imprimirá una lista que contiene "my", "name", "is" "Eric", y finalmente "and".
Como el resto de la frase usa palabras que ya están en nuestro conjunto, no se
incluyen una segunda vez.
Escribe un ejemplo donde una variable sea igual a un texto de una poesia completa, y
cuenta cuantas palabras diferentes contiene.
b) Los conjuntos son una poderosa herramienta en Python dado que tienen la
habilidad de calcular diferencias e intersecciones entre otros conjuntos. Por
ejemplo, pongamos que tienes una lista de participantes en los eventos A y B:
c) Para buscar que miembros asistirán a los dos eventos, debemos usar el
método "intersection":
print(a.intersection(b))
print(b.intersection(a))
d) Para buscar que miembros asistirán solo a uno de los eventos, usaremos el
método "symmetric_difference":
print(a.symmetric_difference(b))
print(b.symmetric_difference(a))
print(a.difference(b))
print(b.difference(a))
f) Para obtener una lista de todos los participantes, usaremos el método "union":
print(a.union(b))
En el mismo ejemplo muestra qué alumnos asistieron al menos a uno de los dos días
de clases.
b = ["John", "Jill"]
1
2
3
9
p) Prueba con ejemplos el operador union | para realizar la unión de dos o más
conjuntos. ¿Funciona? >>> a | b.
2. Relaciones:
2.1 Implemente una Relación de Composición R2cR1 que se define así: Sea R1 una relación
de X a Y y R2 una relación de Y a Z. La composición de R1 y R2, denotada por R2cR1, es la
relación de X a Z definida por R2 c R1 ={(x, z) | (x, y) ∈ R1 y (y, z) ∈ R2 para alguna y ∈ Y}. La
composición de las relaciones R1 = {(1, 2), (1, 6), (2, 4), (3, 4), (3, 6), (3, 8)} y R2 = {(2, u), (4,
s), (4, t), (6, t), (8, u)} es:
R2 cR1 = {(1,u),(1,t),(2,s),(2,t),(3,s),(3,t),(3,u)}
VI