Saltar a contenido

Delitos

Considerando las siguientes estructuras:

calles = [
    # [id_calle1, nombre_calle1], ...
    [883345, 'La Montana'], [321333, 'Miraflores'], [5843, 'Avellaneda'],
    [2283904, 'Del Valle'], [9430, 'Los Maitenes'], [2239102, 'Rio Tolten'],
    [9432, 'Teniente Bello']
]
niveles_peligrosidad = {
    #nivel: [id_calle1, id_calle2, id_calle3, ...]
    2: [883345, 2283904, 5843],
    1: [9430, 2239102,9432], 
    # ...
}
delitos = [
    { 'id_calle': 883345, 'fecha': '2015-03-23'},
    { 'id_calle': 9432, 'fecha': '2015-02-12'},
    { 'id_calle': 5843, 'fecha': '2015-03-21'}, 
    # ...
]
a) Desarrolle la función agregar_delito(delito, delitos, calles, niveles_peligrosidad) que recibe la lista delito con los datos a agregar y las estructuras definidas anteriormente. Si la función logra agregar el delito, debe retornar True, en caso de error debe retornar False. Para agregar un delito correctamente la calle debe existir y tener asociado un nivel de peligrosidad.
>>> agregar_delito([9430, [2016, 1, 1]], delitos, calles, niveles_peligrosidad)
True
>>> agregar_delito([322, [2016, 3, 23]], delitos, calles, niveles_peligrosidad)
False
b) Desarrolle la función mes_mas_peligroso(año, delitos) que recibe la lista de delitos y el año. Esta función debe entregar el nombre del mes del año en el que ocurren más delitos.
>>> mes_mas_peligroso(2015, delitos)
'Marzo'

Solución
def agregar_delito(delito, delitos, calles, niveles_peligrosidad):
    id_calle = delito[0]
    fecha = delito[1]
    año = fecha[0]
    mes = fecha[1]
    dia = fecha[2]
    #buscamos si la calle existe
    existe_calle = False
    for calle in calles:
        id = calle[0]
        nombre = calle[1]
        if id_calle == id:
            existe_calle = True
    existe_nivel = False
    for n in niveles_peligrosidad:
        if id_calle in niveles_peligrosidad[n]:
            existe_nivel = True
    if existe_calle and existe_nivel:
        delitos.append({'id_calle': id_calle, 'fecha': str(año) + '-' + str(mes) + '-' + str(dia)})
        return True
    else:
        return False

def mes_mas_peligroso(año, delitos):
    p = {}
    meses = {
        1: 'Enero', 2: 'Febrero', 3: 'Marzo', 4: 'Abril',
        5: 'Mayo', 6: 'Junio', 7: 'Julio', 8: 'Agosto', 9: 'Septiembre',
        10: 'Octubre', 11: 'Noviembre', 12: 'Diciembre'
    }
    for d in delitos:
        if int(d['fecha'][:4]) == año:
            mes = int(d['fecha'][5:7])
            if mes not in p:
                p[mes] = 0
            p[mes] += 1
    r = []
    for i in p:
        r.append([p[i], i])
    r.sort()
    r.reverse()
    return meses[r[0][1]]


calles = [
    # (id_calle1, nombre_calle1), …
    [883345, 'La Montana'], [321333, 'Miraflores'], [5843, 'Avellaneda'],
    [2283904, 'Del Valle'], [9430, 'Los Maitenes'], [2239102, 'Rio Tolten'],
    [9432, 'Teniente Bello']
]
niveles_peligrosidad = {
    #nivel: [id_calle1, id_calle2, id_calle3, …]
    2: [883345, 2283904, 5843],
    1: [9430, 2239102,9432], 
    # ...
}
delitos = [
    { 'id_calle': 883345, 'fecha': '2015-03-23'},
    { 'id_calle': 9432, 'fecha': '2015-02-12'},
    { 'id_calle': 5843, 'fecha': '2015-03-21'}, 
    # ...
]

print(agregar_delito([9430, [2016, 1, 1]], delitos, calles, niveles_peligrosidad))
print(agregar_delito([322, [2016, 3, 23]], delitos, calles, niveles_peligrosidad))
print(mes_mas_peligroso(2015, delitos))