96 Werte Max finden

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Hypec
User
Beiträge: 177
Registriert: Mittwoch 1. August 2018, 16:11

Sonntag 8. September 2019, 12:27

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
Benutzeravatar
kbr
User
Beiträge: 1064
Registriert: Mittwoch 15. Oktober 2008, 09:27

Sonntag 8. September 2019, 13:10

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
Sirius3
User
Beiträge: 10347
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 8. September 2019, 16:23

Zum Teilen der Liste gibt es `more_itertools.chunked`. Und für das Maximum gibt es `max`.
Hypec
User
Beiträge: 177
Registriert: Mittwoch 1. August 2018, 16:11

Montag 9. September 2019, 21:03

Genau die Argumente zu max haben mit gefehlt danke.
result.append(max(extraction, key=lambda x: x[4]))
Sirius3
User
Beiträge: 10347
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 9. September 2019, 21:13

@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)
]
Benutzeravatar
kbr
User
Beiträge: 1064
Registriert: Mittwoch 15. Oktober 2008, 09:27

Montag 9. September 2019, 22:19

@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.)
Antworten