Saltar a contenido

Autopistas

Una concesionaria de autopista registra en la lista transitos las veces que cada vehículo pasa por uno de los pórticos de cobro. Cada lista de la lista contiene la patente del vehículo seguida del número de pórtico. Por ejemplo:

transitos = [
    ['BBJJ77',2], ['CCHH19',3], ['AAFF37',3], ['BBJJ77',1], 
    ['AAFF37',1], ['DDKK33',3], ['AAFF37',1], ['AAFF37',2]
]

Ejercicio 1

Escriba la función mayor_movilidad(transitos), que retorna una lista de listas con los tres vehículos que pasaron por más pórticos. El primer elemento de cada lista es la patente y el segundo es la cantidad de pórticos por los que paso.

Ejemplo

>>> print(mayor_movilidad(transitos)) 
[['AAFF37', 4], ['BBJJ77', 2], ['DDKK33', 1]]

Ejercicio 2

Escriba la función reportar(transitos), que retorna un diccionario que lista, ordenadamente, los autos que pasaron por cada pórtico. La llave es el número de pórtico, y el valor es la lista de patentes, ordenada alfabeticamente y sin repeticiones.

Ejemplo

>>> print(reportar(transitos))
{2: ['AAFF37', 'BBJJ77'], 3: ['AAFF37', 'CCHH19', 'DDKK33'], 1: ['AAFF37', 'BBJJ77']}
Solución
def mayor_movilidad(transitos):
    # Conteo de patentes #
    conteo = {} # Diccionario para realizar conteo
    for transito in transitos: # Recorrido de la estructura
        patente = transito[0] # Patente
        if patente not in conteo: # Si la patente no existe 
            conteo[patente] = 0 # Creamos el contador
        conteo[patente] += 1 # Sumamos uno cada vez que encontremos la patente
    # Lista temporal para ordenar segun el conteo #
    lista = [] # Estructura: [[conteo_1, patente_1], [conteo_2, patente_2], ...]
    for patente in conteo: # Recorremos el diccionario
        tmp = [conteo[patente], patente] # Dejamos el conteo primero para ordenar con sort
        lista.append(tmp) # Agregamos la lista temporal
    lista.sort() # Ordenamos ascendentemente
    lista.reverse() # Ordenamos descendentemente
    # Lista de salida segun el formato solicitado #
    salida = []
    for conteo, patente in lista[:3]: # Recorremos solo los primeros 3 que necesitamos
        salida.append([patente, conteo]) # Volvemos al orden solicitado
    return salida


def reportar(transitos):
    reporte = {} # Diccionario a retornar
    for transito in transitos: # Recorrido de la estructura
        patente = transito[0]
        portico = transito[1]
        if portico not in reporte: # Si no existe el portico en el diccionario
            reporte[portico] = [] # Se crea una lista vacia
        if patente not in reporte[portico]: # Si la patente no existe en la lista
            reporte[portico].append(patente) # Se agrega
        reporte[portico].sort() # Ordenamos la lista de patentes en orden alfabetico
    return reporte # Retornar diccionario

# Estructura de prueba #
transitos = [
    ['BBJJ77',2], 
    ['CCHH19',3], 
    ['AAFF37',3], 
    ['BBJJ77',1], 
    ['AAFF37',1], 
    ['DDKK33',3], 
    ['AAFF37',1], 
    ['AAFF37',2]
]

# Pruebas #
print(mayor_movilidad(transitos))
print(reportar(transitos))