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]:
El lider del grupo de hackers ’fsociety’ guarda la información de sus miembros en un diccionario con la siguiente información: apodo_miembro: [fecha_ingreso_al_grupo, experticia, ciudad_de_residencia, cjto_conocidos]
.
El conjunto cjto_conocidos
muestra todos los miembros que conoce el hacker: {miembro_1, miembro_2, ..., miembro_n}
. Que un miembro conozca la verdadera identidad de otro miembro no significa que el otro miembro conozca la del primero.
Como ejemplo, considere la siguiente estructura:
In [2]:
# Cargar datos
miembros_fsociety= {
'Eliott': [(2015, 10, 20), 'Seguridad', 'New York',
{'Darlene'}],
'Darlene': [(2013, 3, 22), 'Malware', 'New York',
{'Eliott', 'Cisco'}],
'Cisco': [(2012, 2, 4), 'Sistemas Distribuidos', 'San Francisco',
{'Darlene', 'Romero', 'Eliott'}],
'Mr. Robot': [(2003, 5, 3), 'Analisis de Datos', 'New York',
{'Eliott', 'Darlene', 'Romero', 'Cisco'}]
# ...
}
In [3]:
# Estructura: apodo_miembro: [fecha_ingreso, experticia, ciudad, cjto_conocidos]
def miembro_con_mas_conocidos(miembros):
n_mas_conocidos = 0
apodo_mas_conocidos = ""
for apodo, datos in miembros.items():
n_conocidos = len(datos[-1])
if n_conocidos>n_mas_conocidos:
n_mas_conocidos = n_conocidos
apodo_mas_conocidos = apodo
return apodo_mas_conocidos
print miembro_con_mas_conocidos(miembros_fsociety)
In [4]:
# Estructura: apodo_miembro: [fecha_ingreso, experticia, ciudad, cjto_conocidos]
def actualizar_miembros(miembros, apodo_viejo, apodo_nuevo, ciudad_nueva):
for apodo, datos in miembros.items():
# Cambiar todas las instancias del apodo viejo
cjto_conocidos = datos[-1]
if apodo_viejo in cjto_conocidos:
cjto_conocidos.remove(apodo_viejo)
cjto_conocidos.add(apodo_nuevo)
# Actualizar registro del miembro
if apodo==apodo_viejo:
fecha, experticia, ciudad_vieja, cjto_conocidos = datos
dato_nuevo = (fecha, experticia, ciudad_nueva, cjto_conocidos)
del miembros[apodo_viejo]
miembros[apodo_nuevo] = dato_nuevo
return miembros
for key, val in miembros_fsociety.items():
print key, ":", val
print ""
miembros_fsociety = actualizar_miembros(miembros_fsociety, "Darlene", "Leia", "Valparaiso")
for key, val in miembros_fsociety.items():
print key, ":", val
In [4]:
# Estructura: apodo_miembro: [fecha_ingreso, experticia, ciudad, cjto_conocidos]
def miembros_segun_fecha(miembros, fecha_min, fecha_max):
miembros_en_fechas = []
for apodo, datos in miembros.items():
fecha, experticia, ciudad_vieja, cjto_conocidos = datos
if fecha_min <= fecha <= fecha_max:
miembros_en_fechas.append(apodo)
return miembros_en_fechas
fecha_min = (2000, 1, 1)
fecha_max = (2016, 1, 1)
print miembros_segun_fecha(miembros_fsociety, fecha_min, fecha_max)
fecha_min = (2012, 2, 5)
fecha_max = (2015, 10, 20)
print miembros_segun_fecha(miembros_fsociety, fecha_min, fecha_max)