Warum hat list keine sichere "get" -Methode wie das Wörterbuch?
>>> d = {'a':'b'}
>>> d['a']
'b'
>>> d['c']
KeyError: 'c'
>>> d.get('c', 'fail')
'fail'
>>> l = [1]
>>> l[10]
IndexError: list index out of range
Warum hat list keine sichere "get" -Methode wie das Wörterbuch?
>>> d = {'a':'b'}
>>> d['a']
'b'
>>> d['c']
KeyError: 'c'
>>> d.get('c', 'fail')
'fail'
>>> l = [1]
>>> l[10]
IndexError: list index out of range
l[10:11]
stattl[10]
beispielsweise. () Die Unterliste hat das gewünschte Element, falls vorhanden).get
. Es wäre das Äquivalent zul[i] if i < len(l) else default
, aber lesbarer, prägnanter und würde es ermöglicheni
, ein Ausdruck zu sein, ohne ihn neu berechnen zu müssenNone
wenn eines nicht existiert. Es wäre schön zu sagen gewesen,x = expensive().get(0, None)
damit ich die nutzlose Rendite von teuer nicht in eine temporäre Variable stecken müsste.Antworten:
Letztendlich hat es wahrscheinlich keine sichere
.get
Methode, da adict
eine assoziative Sammlung ist (Werte sind mit Namen verknüpft), bei der es ineffizient ist, zu überprüfen, ob ein Schlüssel vorhanden ist (und seinen Wert zurückzugeben), ohne eine Ausnahme auszulösen, während dies sehr trivial ist um Ausnahmen beim Zugriff auf Listenelemente zu vermeiden (da dielen
Methode sehr schnell ist). Mit dieser.get
Methode können Sie den mit einem Namen verknüpften Wert abfragen und nicht direkt auf das 37. Element im Wörterbuch zugreifen (was eher dem entspricht, was Sie von Ihrer Liste verlangen).Natürlich können Sie dies einfach selbst implementieren:
Sie könnten es sogar monkeypatch auf den
__builtins__.list
Konstruktor in__main__
, aber das wäre eine weniger weit verbreitete Änderung, da die meisten Codes es nicht verwenden. Wenn Sie dies nur mit Listen verwenden möchten, die mit Ihrem eigenen Code erstellt wurden, können Sielist
dieget
Methode einfach unterordnen und hinzufügen .quelle
list
.get
ein Problem, das Listen nicht haben - eine effiziente Möglichkeit, Ausnahmen beim Abrufen von Daten zu vermeiden, die möglicherweise nicht vorhanden sind. Es ist sehr trivial und sehr effizient zu wissen, was ein gültiger Listenindex ist, aber es gibt keine besonders gute Möglichkeit, dies für Schlüsselwerte in einem Wörterbuch zu tun.O(1)
. In rohen Begriffen ist es nicht ganz so schnell wie das Überprüfenlen
, aber aus Sicht der Komplexität sind sie alleO(1)
. Die richtige Antwort ist die typische Verwendung / Semantik ...dict
ist nur Best-Case O (1), nicht alle Fälle..get()
Sie es oder Sie haben Probleme an anderer Stelle in Ihrem Code (oder Ihrer Umgebung). Der Sinn einer solchen Methode ist die Lesbarkeit des Codes. Die "Vanille" -Technik erfordert vier Codezeilen an jeder Stelle, an der dies durchgeführt werden muss. Die.get()
Technik erfordert nur eine und kann leicht mit nachfolgenden Methodenaufrufen (zmy_list.get(2, '').uppercase()
. B. ) verkettet werden .Dies funktioniert, wenn Sie das erste Element möchten, wie z
my_list.get(0)
Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, aber es könnte anderen helfen.
quelle
next(iter(my_list[index:index+1]), 'fail')
Ermöglicht jeden Index, nicht nur 0. Oder weniger FP, aber wohl mehr Pythonic und mit ziemlicher Sicherheit besser lesbar :my_list[index] if index < len(my_list) else 'fail'
.Wahrscheinlich, weil es für die Listensemantik einfach nicht viel Sinn machte. Sie können jedoch ganz einfach Ihre eigenen erstellen, indem Sie Unterklassen erstellen.
quelle
get
Methode benötigen . Lesbarkeit zählt. Und die Lesbarkeit leidet mit jeder zusätzlichen unnötigen Klasse. Verwenden Sie einfach dentry / except
Ansatz, ohne Unterklassen zu erstellen.Anstatt .get zu verwenden, sollte eine solche Verwendung für Listen in Ordnung sein. Nur ein Nutzungsunterschied.
quelle
.get
Methode implementieren (außer ich bin mir nicht sicher, wie Sie erklären würden, was der Index in diesem Fall bedeutet oder warum er jemals fehlschlagen würde).lst[i] if -len(lst) <= i < len(l) else 'fail'
Versuche dies:
quelle
Dank an jose.angel.jimenez
Für die "Oneliner" -Fans ...
Wenn Sie das erste Element einer Liste möchten oder wenn Sie einen Standardwert möchten, wenn die Liste leer ist, versuchen Sie:
kehrt zurück
a
und
kehrt zurück
default
Beispiele für andere Elemente…
Mit Standard-Fallback…
Getestet mit
Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
quelle
value, = liste[:1] or ('default',)
. Es sieht so aus, als ob Sie die Klammern brauchen.Das Beste, was Sie tun können, ist, die Liste in ein Diktat umzuwandeln und dann mit der get-Methode darauf zuzugreifen:
quelle
zip range len
Dings könnte man auch verwendendict(enumerate(my_list))
Also habe ich etwas mehr darüber recherchiert und es stellt sich heraus, dass es dafür nichts Spezielles gibt. Ich war aufgeregt, als ich list.index (value) gefunden habe. Es gibt den Index eines angegebenen Elements zurück, aber es gibt nichts, um den Wert an einem bestimmten Index abzurufen. Wenn Sie also nicht die Lösung safe_list_get verwenden möchten, die ich für ziemlich gut halte. Hier sind einige 1-Zeilen-if-Anweisungen, mit denen die Aufgabe je nach Szenario für Sie erledigt werden kann:
Sie können auch None anstelle von 'No' verwenden, was sinnvoller ist:
Auch wenn Sie nur das erste oder letzte Element in der Liste erhalten möchten, funktioniert dies
Sie können diese auch zu Funktionen machen, aber mir hat die IndexError-Ausnahmelösung immer noch gefallen. Ich habe mit einer heruntergekommenen Version der
safe_list_get
Lösung experimentiert und sie etwas einfacher gemacht (keine Standardeinstellung):Ich habe kein Benchmarking durchgeführt, um zu sehen, was am schnellsten ist.
quelle
list
durch Unterklassen erweitert. Auf diese Weise kann der Konstruktor einelist
oder alles nehmen, was sich wie eine Liste verhält, und die neue Instanz verhält sich wie einelist
. Siehe Keith's Antwort unten, die meiner Meinung nach die akzeptierte sein sollte.dict.get()
um einen Standardwert aus einer Listenindexreferenz zurückzugeben, anstatt abfangen zu müssenIndexError
? Es geht also wirklich um Sprach- / Bibliotheksfunktionen (und nicht um OOP." vs. FP-Kontext). Außerdem muss man Ihre Verwendung von 'pythonic' wahrscheinlich als WWGD (da seine Verachtung für FP Python bekannt ist) qualifizieren und nicht unbedingt nur PEP8 / 20 erfüllen.el = x[4] if len(x) == 4 else 'No'
- meinen Sielen(x) > 4
?x[4]
ist außerhalb der Grenzen, wennlen(x) == 4
.Wörterbücher dienen zum Nachschlagen. Es ist sinnvoll zu fragen, ob ein Eintrag vorhanden ist oder nicht. Listen werden normalerweise iteriert. Es ist nicht üblich zu fragen, ob L [10] existiert, sondern ob die Länge von L 11 beträgt.
quelle
Ihr Anwendungsfall ist grundsätzlich nur relevant, wenn Sie Arrays und Matrizen mit fester Länge erstellen, damit Sie wissen, wie lange sie vor uns liegen. In diesem Fall erstellen Sie sie normalerweise auch, bevor Sie sie von Hand mit None oder 0 füllen, sodass tatsächlich bereits ein Index vorhanden ist, den Sie verwenden.
Man könnte das sagen: Ich brauche ziemlich oft .get () für Wörterbücher. Nach zehn Jahren als Vollzeitprogrammierer glaube ich nicht, dass ich es jemals auf einer Liste gebraucht habe. :) :)
quelle
'lalala' in url.split('/')[2:]
. Das Problem bei Ihrer Lösung hier ist jedoch, dass Sie nur das zweite Element betrachten. Was ist, wenn die URL "/ monkeybonkey / lalala" lautet? Sie erhalten eineTrue
, obwohl die URL ungültig ist.