In [1]:
"""
IPython Notebook v4.0 para python 2.7
Librerías adicionales: Ninguna.
Contenido bajo licencia CC-BY 4.0. Código bajo licencia MIT. (c) Sebastian Flores.
"""
# Configuracion para recargar módulos y librerías
%reload_ext autoreload
%autoreload 2
from IPython.core.display import HTML
HTML(open("style/iwi131.css", "r").read())
Out[1]:
In [ ]:
# Utilizando strings
def letras_en_comun(p, r):
n = 0
letras_a_revisar = p + r
letras_vistas = ""
for c in letras_a_revisar:
if (c in p) and (c in r) and not (c in letras_vistas):
n += 1
letras_vistas += c
return n
## Verificación
print(letras_en_comun('murcielagoo', 'gominola')) # 6
print(letras_en_comun('protozoo', 'agasajada')) # 0
Se pueden definir mediante
{elemento_1, elemento_2, ..., elemento_n}
o bien
set(mi_lista)
Elementos de un conjunto puede ser cualquier objeto inmutable en python.
No existen repeticiones de elementos.
NO existe indexación ni orden en un conjunto.
NO CONFUNDIR CONJUNTOS CON DICCIONARIOS:
{"uno" : 1, "dos" : 2}
{"uno", 1, "dos", 2}
In [6]:
colores_1 = {'rojo', 'gris', 'azul', 'gris'}
colores_2 = set(['azul', 'gris', 'rojo', 'rojo', 'rojo'])
print colores_1
print colores_2
print colores_1==colores_2
#print colores_1[0] # Esto da error
print set('abracadabra')
print set(list('abracadabra'))
print set(['a', 'b', 'c', 'd', 'r', 'c', 'd', 'r'])
In [7]:
print set([1,2,1,2,3,4,3,2,1])
print set("abecedario")
print set(["aa","ab", "ba", "bb", "aa"])
In [10]:
a = set() # conjunto vacio
a.add(19)
a.add(12)
a.add(8)
a.add(12)
print a # set([8, 19, 12])
a.remove(8)
print a # set([19, 12])
print 12 in a # True
print 8 in a # False
In [3]:
a = {1,2,3,4}
b = set(range(2,9,2))
c = set([2,4,8,16,32])
d = {2,3}
print "a=", a
print "len(a)=", len(a)
print "b=", b
print "len(b)=", len(b)
print "c=", c
print "len(c)=", len(c)
print "a&b=", a & b
print "a|b=", a | b
print "a-b=", a - b
#print "a+b=", a + b
print "a < a=", a < a
print "a <= a=", a <= a
print "d <= a=", d < a
print "a <= d=", a < d
In [16]:
# Funciona
colores = {"rojo", "verde", "rojo", "verde", "azul"}
for color in colores:
print color, "es un bello color"
In [20]:
# Da error
colores = {"rojo", "verde", "rojo", "verde", "azul"}
#colores = list(colores)
j=0
while j<len(colores):
print colores[j], "es un bello color"
j+=1
In [21]:
a = {1,2,3,4}
b = set(range(2,9,2))
c = set([2,4,8,16,32])
print a
print b
print c
# Diferencia simetrica
print (b-a) | (a-b)
print (b|a) - (a&b)
# Interseccion de 3 conjuntos
print a&b&c
In [22]:
# Utilizando diccionarios
def letras_en_comun(p, r):
# Obtener el primer conjunto de letras
p1 = set(p)
# Obtener el segundo conjunto de letras
r1 = set(r)
# Intersectar los conjuntos
interseccion = p1 & r1
# Contar el número de elementos comunes
return len(interseccion)
## Verificación
print(letras_en_comun('murcielagoo', 'gominola')) # 6
print(letras_en_comun('protozoo', 'agasajada')) # 0
In [ ]:
# Utilizando conjuntos, versión extendida
def letras_en_comun(p, r):
# Obtener el primer conjunto de letras
A = set(p)
# Obtener el segundo conjunto de letras
B = set(r)
# Intersectar los conjuntos
C = A & B
# Contar el número de elementos comunes
n = len(C)
return n
## Verificación
print(letras_en_comun('murcielagoo', 'gominola')) # 6
print(letras_en_comun('protozoo', 'agasajada')) # 0
In [23]:
# Utilizando conjuntos, versión reducida
def letras_en_comun(p, r):
return len(set(p) & set(r))
## Verificación
print(letras_en_comun('murcielagoo', 'gominola')) # 6
print(letras_en_comun('protozoo', 'agasajada')) # 0
In [25]:
def elementos(mis_listas):
# FIX ME
return
mi_lista = [ ["uno", "dos", "tres", "cuatro", "cinco"],
["dos", "cuatro", "seis", "ocho", "diez"],
["uno", "uno", "dos", "tres", "cinco", "ocho", "once"],
# ...
]
#print set(mi_lista) # da error
print elementos(mi_lista) # Deberia dar 9
In [27]:
# Solución
def elementos(mis_listas):
elementos = set()
for lista in mis_listas:
elementos = elementos | set(lista) # += , |=
#elementos |= set(lista) # += , |=
return elementos
mi_lista = [ ["uno", "dos", "tres", "cuatro", "cinco"],
["dos", "cuatro", "seis", "ocho", "diez"],
["uno", "uno", "dos", "tres", "cinco", "ocho", "once"],
# ...
]
print elementos(mi_lista) # Deberia dar 9
In [29]:
d = {"uno":1, "one":1, "un":1,
"dos":2, "two":2, "deux":2,
"tres":3, "three":3, "trois":3,
# ...
}
# Tupla de llaves no repetidas
print tuple(set(d.keys()))
# Lista de valores no repetidos
print list(set(d.values()))
In [ ]:
# Solución
d = {"uno":1, "one":1, "un":1,
"dos":2, "two":2, "deux":2,
"tres":3, "three":3, "trois":3,
# ...
}
# Tupla de llaves no repetidas
print tuple(set(d.keys())) # O directamente print tuple(d.keys())
#porque las llaves no pueden repetirse.
# Lista de valores no repetidos
print list(set(d.values()))
In [30]:
alumnos = [{"nombre":"Sebastian Flores", "rol":"2004001-7",
"ramos":["mate1", "progra", "fisica", "hum2"]},
{"nombre":"Sebastian Fernandez", "rol":"2004002-8",
"ramos":["mate1", "progra2"]},
{"nombre":"Maria Jose Vargas", "rol":"2004007-3",
"ramos":["mate1", "progra", "fisica", "hum1"]},
{"nombre":"Cesar Moltedo", "rol":"2011001-4",
"ramos":["mate1", "progra", "progra2", "progra3"]},
# ...
]
In [ ]:
In [31]:
# Nombres no repetidos solucion
nombres_set = set()
for alumno in alumnos:
# Alumno es un diccionario
nombre_completo = alumno["nombre"]
nombre_pila = nombre_completo.split(" ")[0]
nombres_set.add(nombre_pila)
print nombres_set
In [ ]:
alumnos = [{"nombre":"Sebastian Flores", "rol":"2004001-7",
"ramos":["mate1", "progra", "fisica", "hum2"]},
{"nombre":"Sebastian Fernandez", "rol":"2004002-8",
"ramos":["mate1", "progra2"]},
{"nombre":"Maria Jose Vargas", "rol":"2004007-3",
"ramos":["mate1", "progra", "fisica", "hum1"]},
{"nombre":"Cesar Moltedo", "rol":"2011001-4",
"ramos":["mate1", "progra", "progra2", "progra3"]},
# ...
]
In [ ]:
# Ramos no repetidos
In [ ]:
# Ramos no repetidos solucion
ramos_set = set()
for alumno in alumnos:
# alumno es un diccionario
lista_ramos = alumno["ramos"]
ramos_set = ramos_set | set(lista_ramos)
print ramos_set
El director técnico de la selección chilena le entrega como información una lista de tuplas con sus jugadores. Cada jugador viene representado por una tupla con la siguiente estructura: (nombre, informacion). A su vez, esta información es una tupla con la siguiente estructura: (posicion, goles, precio). Considere la siguiente estructura como ejemplo:
In [33]:
jugadores = [
#(nombre,(posicion,goles,precio))
('Alexis Sanchez',('delantero',8,14000000)),
('Arturo Vidal',('central',3,4000000)),
('Claudio Bravo',('arquero',1,300000)),
('Gary Medel',('defensa',1,6000000)),
('Gonzalo Jara',('defensa',1,3000000)),
('Eugenio Mena',('defenda',0,5000000)),
('Miguel Pinto',('arquero',1,2000000)),
('Fabian Orellana',('delantero',3,4000000))
]
a) Implemente la función jugadores_por_posicion(posicion,jugadores), la cual recibe como parámetro un string con la posición y la lista de tuplas de jugadores. Esta función debe retornar un conjunto con los nombres de los jugadores que se desempeñan en dicha posición:
print jugadores_por_posicion('delantero',jugadores)
{'Alexis Sanchez', 'Fabian Orellana'}
print jugadores_por_posicion('defensa',jugadores)
{'Gary Medel', 'Gonzalo Jara'}
print jugadores_por_posicion('arquero',jugadores)
{'Claudio Bravo', 'Miguel Pinto'}
In [ ]:
def jugadores_por_posicion(posicion, jugadores):
return
print jugadores_por_posicion('delantero',jugadores)
print jugadores_por_posicion('defensa',jugadores)
print jugadores_por_posicion('arquero',jugadores)
In [ ]:
def jugadores_por_posicion(posicion, jugadores):
jugadores_en_posicion = set()
for jugador, (pos, gol, precio) in jugadores:
if pos==posicion:
jugadores_en_posicion.add(jugador)
return jugadores_en_posicion
print jugadores_por_posicion('delantero',jugadores)
print jugadores_por_posicion('defensa',jugadores)
print jugadores_por_posicion('arquero',jugadores)
b) Implemente la función cantidad_goles(nombre,jugadores)
, la cual recibe como parámetro un string con el nombre de un jugador y la lista de tuplas jugadores. Esta función debe retornar la cantidad de goles realizados por dicho jugador.
print cantidad_goles('Alexis Sanchez',jugadores)
8
print cantidad_goles('Eugenio Mena',jugadores)
0
In [ ]:
def cantidad_goles(nombre, jugadores):
return
print cantidad_goles('Alexis Sanchez',jugadores)
print cantidad_goles('Eugenio Mena',jugadores)
print cantidad_goles('Sebastian Flores',jugadores)
In [34]:
def cantidad_goles(nombre, jugadores):
for jugador, (pos, gol, precio) in jugadores:
if jugador==nombre:
return gol
# Si llegamos aqui, no encontramos el nombre
print nombre, "no esta en la seleccion Chilena."
return 0
print cantidad_goles('Alexis Sanchez',jugadores)
print cantidad_goles('Eugenio Mena',jugadores)
print cantidad_goles('Sebastian Flores',jugadores)
c) Implemente la función cantidad_goles_por_posicion(posiciones,jugadores)
, la cual recibe como parámetro un conjunto con las posiciones y la lista de tuplas jugadores. Este conjunto tiene la siguiente estructura:
posiciones = {'arquero','defensa','central','delantero'}
La función retorna un diccionario cuyas claves son las posiciones de los jugadores y su valor la cantidad total de goles realizados por jugadores que se desempeñan en dicha posici on.
posiciones = {'arquero','defensa','central','delantero'}
print cantidad_goles_por_posicion(posiciones,jugadores)
{'defensa': 2, 'arquero': 2, 'central': 3, 'delantero': 11}
In [39]:
def cantidad_goles_por_posicion(posiciones, jugadores):
goles = {}
for pos in posiciones:
goles[pos] = 0
for jugador, (pos, gol, precio) in jugadores:
if pos in posiciones:
goles[pos] += gol
return goles
posiciones = {'defensa','central'}
print cantidad_goles_por_posicion(posiciones, jugadores)
In [ ]:
def cantidad_goles_por_posicion(posiciones, jugadores):
# Inicializar el diccionario vacio
goles_por_posicion = {}
for posicion in posiciones:
goles_por_posicion[posicion] = 0
# Llenar el diccionario
for jugador, (pos, gol, precio) in jugadores:
if pos in posiciones:
goles_por_posicion[pos] += gol
return goles_por_posicion
posiciones = {'arquero','defensa','central','delantero'}
print cantidad_goles_por_posicion(posiciones, jugadores)