Ich habe Code, der ungefähr so aussieht:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
ok also das ist vereinfacht aber du kommst auf die idee. Jetzt ist thing
möglicherweise nicht wirklich in der Liste, in diesem Fall möchte ich -1 als übergeben thing_index
. In anderen Sprachen ist dies das, was Sie erwarten würden index()
, wenn das Element nicht gefunden werden könnte. In der Tat wirft es ein ValueError
.
Ich könnte das tun:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Aber das fühlt sich schmutzig an und ich weiß nicht, ob ValueError
es aus einem anderen Grund angehoben werden könnte. Ich habe die folgende Lösung basierend auf Generatorfunktionen entwickelt, die jedoch etwas komplex erscheint:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
Gibt es einen saubereren Weg, um dasselbe zu erreichen? Nehmen wir an, die Liste ist nicht sortiert.
thing_index
." - Das ist definitiv unpythonisch. Das Übergeben eines (bedeutungslosen) Token-Werts für den Fall, dass eine Operation nicht erfolgreich ist, ist verpönt - Ausnahmen sind hier wirklich der richtige Weg. Zumalthing_list[-1]
es sich um einen gültigen Ausdruck handelt, der den letzten Eintrag in der Liste bedeutet.str.find
Methode, die genau das tut: Gibt zurück,-1
wenn die Nadel im Betreff nicht gefunden wird.str.index()
löst eine Ausnahme aus, wenn die Suchzeichenfolge nicht gefunden wird.Antworten:
Die Verwendung der try-without-Klausel ist nicht "schmutzig". Dies ist der pythonische Weg.
ValueError
wird nur von der.index
Methode ausgelöst, da dies der einzige Code ist, den Sie dort haben!Um den Kommentar zu beantworten:
In Python ist es gut etabliert, um Vergebung zu bitten, als um eine Erlaubnisphilosophie zu erhalten , und no
index
wird diese Art von Fehler für keine anderen Probleme auslösen. Nicht, dass mir irgendetwas einfallen könnte.quelle
{}.get(index, '')
mehr pythonisch? Ganz zu schweigen von kürzeren besser lesbaren.None
anstelle von -1 wäre in Ordnung, aber wie Sie selbst kommentiert haben, gibt str.find () -1 zurück. Warum sollte es also keine list.find () geben, die dasselbe tut? Ich kaufe nicht das "pythonische" Argumentotherfunction
. Auf der anderen Seite, wenn es nicht kaputt ist, ...Eine Linie. Einfach. Keine Ausnahmen.
quelle
for
.indexOf = lambda item,list_ : list_.index(item) if item in list_ else -1 # OR None
Der
dict
Typ hat eineget
Funktion . Wenn der Schlüssel nicht im Wörterbuch vorhanden ist, ist das zweite Argumentget
der Wert, den er zurückgeben soll. Ebenso gibt essetdefault
, was den Wert in der zurückgibtdict
wenn der Schlüssel vorhanden ist, andernfalls wird der Wert gemäß Ihrem Standardparameter festgelegt und dann Ihr Standardparameter zurückgegeben.Sie können den
list
Typ um einegetindexdefault
Methode erweitern.Welches könnte dann verwendet werden wie:
quelle
Es ist nichts falsch mit Ihrem Code, der verwendet
ValueError
. Hier ist noch ein Einzeiler, wenn Sie Ausnahmen vermeiden möchten:quelle
next()
Funktion ist in Python 2.6+ vorhanden. Aber es ist einfach für 2.5 zu implementieren, siehe next () Funktionsimplementierung für Python 2.5Diese Ausgabe ist eine der Sprachphilosophie. In Java zum Beispiel gab es immer die Tradition, dass Ausnahmen eigentlich nur unter "außergewöhnlichen Umständen" verwendet werden sollten, wenn Fehler aufgetreten sind, und nicht zur Flusskontrolle . Am Anfang war dies aus Leistungsgründen, da Java-Ausnahmen langsam waren, aber jetzt ist dies der akzeptierte Stil geworden.
Im Gegensatz dazu hat Python immer Ausnahmen verwendet, um den normalen Programmablauf anzuzeigen, wie z.
ValueError
B. das Erhöhen von a, wie wir hier diskutieren. Im Python-Stil ist daran nichts "schmutziges", und es gibt noch viel mehr, woher das kommt. Ein noch häufigeres Beispiel ist eineStopIteration
Ausnahme, die durch dienext()
Methode eines Iterators ausgelöst wird , um zu signalisieren, dass keine weiteren Werte vorhanden sind.quelle
StopIteration
weil klar definiert ist, was die Ausnahme bedeutet.ValueError
ist nur ein bisschen zu allgemein.Wenn Sie dies häufig tun, ist es besser, es in einer Hilfsfunktion aufzubewahren:
quelle
Was ist damit?
quelle
Was ist damit:
Anstatt etwas so Implementierungsabhängiges wie einen Listenindex in einer Funktionsschnittstelle verfügbar zu machen, übergeben Sie die Sammlung und das Objekt und lassen Sie andere Funktionen die Probleme mit dem "Test auf Mitgliedschaft" behandeln. Wenn eine andere Funktion als sammlungsunabhängig geschrieben wird, beginnt sie wahrscheinlich mit:
Dies funktioniert, wenn thing_collection eine Liste, ein Tupel, eine Menge oder ein Diktat ist.
Dies ist möglicherweise klarer als:
Welches ist der Code, den Sie bereits in einer anderen Funktion haben.
quelle
Was ist damit:
quelle
Ich habe das gleiche Problem mit der Methode ".index ()" in Listen. Ich habe kein Problem mit der Tatsache, dass es eine Ausnahme auslöst, aber ich bin absolut nicht einverstanden mit der Tatsache, dass es sich um einen nicht beschreibenden ValueError handelt. Ich könnte verstehen, ob es ein IndexError gewesen wäre.
Ich kann sehen, warum die Rückgabe von "-1" ebenfalls ein Problem darstellt, da es sich um einen gültigen Index in Python handelt. Aber realistisch gesehen erwarte ich nie, dass eine ".index ()" - Methode eine negative Zahl zurückgibt.
Hier geht ein Einzeiler (ok, es ist eine ziemlich lange Zeile ...), geht die Liste genau einmal durch und gibt "Keine" zurück, wenn der Artikel nicht gefunden wird. Es wäre trivial, es umzuschreiben, um -1 zurückzugeben, falls Sie dies wünschen.
Wie benutzt man:
quelle
Ich weiß nicht, warum du denken solltest, dass es schmutzig ist ... wegen der Ausnahme? Wenn Sie einen Oneliner möchten, hier ist er:
aber ich würde davon abraten, es zu benutzen; Ich denke, Ross Rogers Lösung ist die beste. Verwenden Sie ein Objekt, um Ihr gewünschtes Verhalten zu kapseln. Versuchen Sie nicht, die Sprache auf Kosten der Lesbarkeit an ihre Grenzen zu bringen.
quelle
find()
Funktion einkapseln und alles wird sauber sein;)Ich würde vorschlagen:
quelle