Ich habe eine Liste:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
Das maximale Element ist 55 (zwei Elemente an Position 9 und 12).
Ich muss herausfinden, an welcher Position (en) sich der Maximalwert befindet. Bitte helfen Sie.
zeigt Ihnen den Index der ersten Instanz des größten bewerteten Elements der Liste an
a
.quelle
Die gewählte Antwort (und die meisten anderen) erfordern mindestens zwei Durchgänge durch die Liste.
Hier ist eine One-Pass-Lösung, die für längere Listen die bessere Wahl sein könnte.
Bearbeitet: Um die beiden von @John Machin aufgezeigten Mängel zu beheben. Für (2) habe ich versucht, die Tests basierend auf der geschätzten Wahrscheinlichkeit des Auftretens jeder Bedingung und den Schlussfolgerungen der Vorgänger zu optimieren. Es war ein wenig schwierig , die richtigen Initialisierungswerte für herauszufinden ,
max_val
undmax_indices
die für alle möglichen Fälle gearbeitet, vor allem , wenn der max der erste Wert in der Liste zufällig - aber ich glaube , dass es jetzt der Fall ist.quelle
[]
("Rückgabeliste"). Code sollte einfach seinif not seq: return []
. (2) Das Testschema in der Schleife ist nicht optimal: Im Durchschnitt in Zufallslisten ist die Bedingungval < maxval
am häufigsten, aber der obige Code benötigt 2 Tests anstelle von einem.==
statt 2 macht - Ihrelif
Zustand wird immer wahr sein.elif
selbst gefangen , FWIW. ;-)Ich habe mir Folgendes ausgedacht und es funktioniert, wie Sie sehen können
max
,min
und andere Funktionen über Listen wie diese:Betrachten Sie also bitte die nächste Beispielliste, um die Position des Maximums in der Liste herauszufinden
a
:Den Generator benutzen
enumerate
und ein Casting machenAn dieser Stelle können wir die Position von max mit extrahieren
Das Obige sagt uns, das Maximum ist in Position 4 und sein Wert ist 5.
Wie Sie sehen, können Sie im
key
Argument das Maximum für jedes iterierbare Objekt ermitteln, indem Sie ein geeignetes Lambda definieren.Ich hoffe, dass es dazu beiträgt.
PD: Wie @PaulOyster in einem Kommentar feststellte. Mit
Python 3.x
demmin
undmax
erlauben Sie ein neues Schlüsselwortdefault
, das die Auslöseausnahme vermeidet,ValueError
wenn das Argument eine leere Liste ist.max(enumerate(list), key=(lambda x:x[1]), default = -1)
quelle
Ich kann die von @martineau zitierte Leistung von @ SilentGhost nicht reproduzieren. Hier ist meine Anstrengung mit Vergleichen:
=== maxelements.py ===
Ergebnisse eines verprügelten alten Laptops mit Python 2.7 unter Windows XP SP3:
quelle
So mache ich es normalerweise.
quelle
Sie können auch das numpy-Paket verwenden:
Dies gibt ein numpy-Array aller Indizes zurück, die den Maximalwert enthalten
Wenn Sie dies in eine Liste umwandeln möchten:
quelle
quelle
Auch eine Lösung, die nur das erste Erscheinungsbild ergibt , kann erreicht werden durch
numpy
:quelle
@shash hat dies an anderer Stelle beantwortet
Welches macht man vorbei . Es ist jedoch langsamer als die Lösung von @Silent_Ghost und vor allem von @nmichaels:
quelle
Hier ist der Maximalwert und die Indizes, unter denen er angezeigt wird:
Später: zur Zufriedenheit von @SilentGhost
quelle
heapq
- das Maximum dort zu finden, wäre trivial.heapq
Lösung sehen, aber ich bezweifle, dass sie funktionieren würde.Ähnliche Idee mit einem Listenverständnis, aber ohne Aufzählung
quelle
a[i]
Aufrufs sicherlich langsamer als die Lösung mit Aufzählung .Nur eine Zeile:
quelle
Wenn Sie die Indizes der größten
n
Zahlen in einer Liste mit dem Namen erhalten möchtendata
, können Sie Pandas verwendensort_values
:quelle
quelle
Dieser Code ist nicht so ausgefeilt wie die zuvor veröffentlichten Antworten, funktioniert aber:
Die Liste im obigen Code würde alle Positionen der maximalen Anzahl in der Liste enthalten.
quelle
Sie können dies auf verschiedene Arten tun.
Der alte konventionelle Weg ist,
Eine andere Möglichkeit, ohne die Länge der Liste zu berechnen und den Maximalwert für eine Variable zu speichern,
Wir können es auf pythonische und kluge Weise tun! Verwenden des Listenverständnisses nur in einer Zeile,
Alle meine Codes sind in Python 3.
quelle