Safe max () - Funktion für leere Listen
Bewertung,
max_val = max(a)
wird den Fehler verursachen,
ValueError: max() arg is an empty sequence
Gibt es eine bessere Möglichkeit der Absicherung gegen diese Fehler andere als ein try
, except
fangen?
a = []
try:
max_val = max(a)
except ValueError:
max_val = default
- Die
default
- argument gibt ein Objekt zurück, wenn der bereitgestellte iterierbar ist leer. - Warum Sie keine post-Antwort als Antwort?!
- weil es zu einfach ist.
- Was ist falsch mit posting Antworten, dass sind "zu einfach"? Jetzt hat jemand anderes zu...
InformationsquelleAutor Alexander McFarlane | 2016-03-22
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Python 3.4+ Sie können
default
- Schlüsselwort-argument:In niedriger version, die Sie verwenden können
or
:HINWEIS: Die zweite Methode funktioniert nicht für alle iterables. vor allem für iterator, der Ertrag aber nichts als die Wahrheit Wert.
my_max
Funktion, die imitiert die neueren Verhalten.max(iter([]) or 0)
ist genau das, was mir die Trauer in den ersten Platz... haben Sie weitere Anregungen, was tun Sie mit ihm? Zweitens ist es mir nie eingefallen, zu prüfen, die docs... ich nahm an, eine so einfache Funktion war ein one-in-one-out-Prozessone-in-one-out process
. Bedeutet es, eine gemeinsame Aufgabe?In den Versionen von Python, die älter als 3.4 können Sie
itertools.chain()
weiteren Wert hinzufügen, um die möglicherweise leere Sequenz. Diese kümmert sich um alle leeren iterierbar, aber beachten Sie, dass es ist nicht genau die gleiche, wie die Versorgung derdefault
argument, da der zusätzliche Wert, der ist immer im Lieferumfang enthalten:Aber in Python 3.4, der Standard wird ignoriert, wenn die Sequenz nicht leer ist:
chain
über einfache Liste Verkettung z.B.max( [42], [] )
wo der Standard ist42
?max
mit mehreren Argumenten eine andere Bedeutung hat, als der Aufruf mit nur einem argument. Mit einem einzigen iterierbar argumentmax
wird wieder das größte element enthält, aber mit mehreren Argumenten vergleicht diese direkt (also nicht iterativ). z.B.max([42], [])
ist eine Liste[42]
abermax(chain([42], []))
undmax([], default=42)
beide geben42
.Andere Lösung könnte sein, die durch die Verwendung von ternären Operatoren:
oder
Max eine leere Sequenz sein "sollte" eine unendlich kleine Sache, von welcher Art die Elemente der Sequenz. Leider, (1) mit einer leeren Sequenz, die Sie können nicht sagen, welche Art der Elemente bestimmt waren, zu haben, und (2) es gibt, z.B., keine solche Sache wie die meisten-negative Ganzzahl in Python.
So dass Sie brauchen, um zu helfen
max
aus, wenn Sie wollen, es zu tun, etwas vernünftiges, in diesem Fall. In den letzten Versionen von Python gibt es einedefault
argumentmax
(das scheint mir eine irreführende Bezeichnung, aber egal), die verwendet werden, wenn Sie eine leere Sequenz. In älteren Versionen Sie müssen nur sicherstellen, dass die Sequenz, die Sie übergeben, ist nicht leer -- z.B. durchor
ing es mit einer singleton-Sequenz mit dem Wert, den Sie verwenden möchten, in diesem Fall.[BEARBEITET lange nach der Veröffentlichung, weil Yaakov Rülpsen freundlich darauf hingewiesen in den Kommentaren, dass ich geschrieben habe "unendlich großen", wo ich geschrieben haben soll "unendlich klein".]
Bedenkt man all die Kommentare über es kann ein wrapper wie diese: