Tengo una función que obtiene un conjunto de datos de un servidor, los ordena y los muestra

def load_data(dateStr):
    data = get_date(dateStr).splitlines()
    result = []
    for c in data:
        a = c.split(',')
        time = a[0]
        temp = float(a[1])
        solar = float(a[2])
        kwH = a[3:]
        i = 0
        while i < len(power):
            power[i] = int(power[i])
            i = i+1
        result.append((time, temp, solar, tuple(kwH)))
    return result

Esto es lo que devuelve la función cuando ingresa una fecha en particular (solo 3 entradas de una lista larga), el primer número en cada entrada es la hora, el segundo es la temperatura.

>>> load_data('20-01-2014')
[('05:00', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 18, 34)), ('05:01', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 20, 26)), ('05:02', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 17, 35))

Necesito escribir una función para encontrar la temperatura máxima de una fecha y mostrar todas las horas del día en que ocurrió el máximo. Algo como esto:

>>> data = load_data('07-10-2011')
>>> max_temp(data)
(18.9, ['13:08', '13:09', '13:10'])

¿Cómo voy a hacer esto? ¿O puedes señalarme a cualquier lugar que pueda tener respuestas?

0
user3996503 1 sep. 2014 a las 13:21

3 respuestas

La mejor respuesta

La forma más óptima de obtener todos tiempos de coincidencia para la temperatura máxima es simplemente recorrer los valores y rastrear el máximo encontrado hasta ahora :

def max_temp(data):
    maximum = float('-inf')
    times = []
    for entry in data:
        time, temp = entry[:2]
        if temp == maximum:
            times.append(time)
        elif temp > maximum:
            maximum = temp
            times = [time]
    return maximum, times

Esto recorre los datos solo una vez .

La forma conveniente (que probablemente tendrá un rendimiento cercano de todos modos) es utilizar la función max() para encontrar primero la temperatura máxima, luego una lista de comprensión para regresar todos los tiempos con esa temperatura:

def max_temp(data):
    maximum = max(data, key=lambda e: e[1])[1]
    return maximum, [e[0] for e in data if e[1] == maximum]

Esto realiza un bucle dos veces sobre los datos, pero el bucle max() se implementa principalmente en código C.

0
Martijn Pieters 1 sep. 2014 a las 09:38
def max_temp(data):
    maxt = max([d[1] for d in data])
    return (maxt, [d[0] for d in data if d[1] == maxt])
0
whyask37 1 sep. 2014 a las 09:36

Esta es una forma de hacerlo (esto recorre los datos dos veces):

>>> data = [('05:00', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 18, 34)), ('05:01', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 20, 26)), ('05:02', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 17, 35))]
>>> max_temp = max(data, key=lambda x: x[1])[1]
>>> max_temp
19.9
>>> result = [item for item in data if item[1] == max_temp]
>>> result
[('05:00', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 18, 34)), ('05:01', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 20, 26)), ('05:02', 19.9, 0.0, (0, 0, 0, 0, 0, 0, 0, 17, 35))]
1
shaktimaan 1 sep. 2014 a las 09:26