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]:






IWI131

Programación de Computadores

Sebastián Flores

http://progra.usm.cl/

https://www.github.com/usantamaria/iwi131

Grupos

  • ALMEIDA, CURIHUAL, ARRATIA
  • ALVARADO, ETEROVIC, CANALES
  • GALLARDO, REQUENA, CODDOU
  • PROBOSTE, REYES, SANDOVAL
  • SCHWERTER, ZEGERS, TORREBLANCA
  • CATALAN, CHAURA, SALAS
  • COLLAO, ESTRADA, BAHAMONDE
  • DURÁN, MORALES,CANTILLANA
  • GRUNERT, KANZUA, CASTRO
  • LOPEZ, LOPEZ, ESTAY
  • MEDIANO, LOBOS, FLORES
  • OGALDE, CARRIEL, HERRERA
  • SANTELICES, PÉREZ
  • CASTILLO, ARÉVALO

Revisión de la Actividad 4 - Diccionarios y Conjuntos

Enunciado

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'}]
# ...
}

Pregunta 1

Se necesita conocer el apodo del miembro con mayor número de conocidos.


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)


Mr. Robot

Pregunta 2

Cuando algun miembro del grupo corre peligro de ser descubierto es necesario borrar el registro de ese miembro, cambiarle el apodo por otro y trasladarlo de ciudad. Debe recordar actualizar el diccionario completo.


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


Mr. Robot : [(2003, 5, 3), 'Analisis de Datos', 'New York', set(['Romero', 'Cisco', 'Darlene', 'Eliott'])]
Eliott : [(2015, 10, 20), 'Seguridad', 'New York', set(['Darlene'])]
Darlene : [(2013, 3, 22), 'Malware', 'New York', set(['Eliott', 'Cisco'])]
Cisco : [(2012, 2, 4), 'Sistemas Distribuidos', 'San Francisco', set(['Eliott', 'Romero', 'Darlene'])]

Mr. Robot : [(2003, 5, 3), 'Analisis de Datos', 'New York', set(['Romero', 'Leia', 'Cisco', 'Eliott'])]
Eliott : [(2015, 10, 20), 'Seguridad', 'New York', set(['Leia'])]
Leia : ((2013, 3, 22), 'Malware', 'Valparaiso', set(['Eliott', 'Cisco']))
Cisco : [(2012, 2, 4), 'Sistemas Distribuidos', 'San Francisco', set(['Eliott', 'Leia', 'Romero'])]

Pregunta 3

Se necesita conocer los nombres de todos los miembros que hayan ingresado a la organizacion entre 2 fechas (inclusive).


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)


['Mr. Robot', 'Eliott', 'Darlene', 'Cisco']
['Eliott', 'Darlene']