Seite 1 von 1

96 Werte Max finden

Verfasst: Sonntag 8. September 2019, 12:27
von Hypec
Hallo,
ich habe eine Liste mit mit 2880 Tuples, 30 Tage lang alle 15 min ein neues. Jetzt will ich immer 96 Tuples zusammenfassen und das mit dem größten Wert bei dem Index 4 in eine neue Liste schreiben wo am Ende dann für jeden Tag das Tuple mit dem größten Wert drin ist. Wie kann ich das ganze am besten lösen?

Tuple:
(40342, 1.0, 4.0, '2019-08-14 11:45', 22.3)
Zum teilen der Liste hab ich hier schon eine Funktion:

Code: Alles auswählen

def split_list(the_list, chunk_size):
    result_list = []
    while the_list:
        result_list.append(the_list[:chunk_size])
        the_list = the_list[chunk_size:]
    return result_list

Re: 96 Werte Max finden

Verfasst: Sonntag 8. September 2019, 13:10
von kbr
Du nutzt schon Slicing. Damit ist es zur Lösung nicht mehr weit:

Code: Alles auswählen

start = 0
stop = stepwidth = 96
result = []
while True: 
    extraction = tuples[start:stop]
    if not extraction:
        break
    result.append(max(extraction, key=lambda x: x[4]))
    start = stop
    stop += stepwidth

Re: 96 Werte Max finden

Verfasst: Sonntag 8. September 2019, 16:23
von Sirius3
Zum Teilen der Liste gibt es `more_itertools.chunked`. Und für das Maximum gibt es `max`.

Re: 96 Werte Max finden

Verfasst: Montag 9. September 2019, 21:03
von Hypec
Genau die Argumente zu max haben mit gefehlt danke.
result.append(max(extraction, key=lambda x: x[4]))

Re: 96 Werte Max finden

Verfasst: Montag 9. September 2019, 21:13
von Sirius3
@kbr: statt der while-Schleife sollte man eine for-Schleife benutzen:

Code: Alles auswählen

stepwidth = 96
result = []
for idx in range(0, len(tuples), stepwidth):
    extraction = tuples[idx : idx+stepwidth]
    result.append(max(extraction, key=lambda x: x[4]))
Das läßt sich dann auch einfach in eine List-Comprehension umformen:

Code: Alles auswählen

stepwidth = 96
result = [
    max(tuples[idx : idx+stepwidth], key=lambda x: x[4])
    for idx in range(0, len(tuples), stepwidth)
]

Re: 96 Werte Max finden

Verfasst: Montag 9. September 2019, 22:19
von kbr
@Sirius3: Auch ich schreibe gerne List-Comprehensions, bis die Lesbarkeit an ihre Grenzen stößt. Die while-Schleife ist in diesem Fall, meiner Ansicht nach, für Ungeübte leichter zu verstehen. Warum hast Du nicht die von Dir eingebrachte more-itertools Lösung präsentiert?

Code: Alles auswählen

stepwith = 96
result = [
    max(chunk, key=lambda x: x[4]) 
    for chunk in more_itertools.chunked(tuples, stepwidth)
]   
(Von allen drei Varianten läuft diese am langsamsten. For- und while-loop laufen etwa gleich schnell – for marginal langsamer. Der Byte-Code der while-loop ist umfangreicher, der der for-loop, wie es scheint, teurer.)