a=['123','2',4]
b=a[4] or 'sss'
print b
Ich möchte einen Standardwert erhalten, wenn der Listenindex außerhalb des Bereichs liegt (hier: 'sss'
).
Wie kann ich das machen?
Im Python Geist von "Bitte um Vergebung, nicht um Erlaubnis", hier ist eine Möglichkeit:
try:
b = a[4]
except IndexError:
b = 'sss'
Im Nicht-Python-Geist von "Bitte um Erlaubnis, nicht um Vergebung" gibt es einen anderen Weg:
b = a[4] if len(a) > 4 else 'sss'
Im Python Geist des Schönen ist besser als hässlich
Code Golf Methode, mit Slice und Auspacken (nicht sicher, ob dies vor 4 Jahren gültig war, aber es ist in python 2.7 + 3.3)
b,=a[4:5] or ['sss']
Schöner als eine Wrapper-Funktion oder Try-Catch IMHO, aber einschüchternd für Anfänger. Persönlich finde ich Tuple beim Auspacken sexier als auf der Liste [#]
mit schneiden ohne auspacken:
b = a[4] if a[4:] else 'sss'
oder, wenn Sie dies oft tun müssen und es Ihnen nichts ausmacht, ein Wörterbuch zu erstellen
d = dict(enumerate(a))
b=d.get(4,'sss')
ein anderer Weg:
b = (a[4:]+['sss'])[0]
Sie können Ihre eigene Listenklasse erstellen:
class MyList(list):
def get(self, index, default=None):
return self[index] if len(self) > index else default
Du kannst es so benutzen:
>>> l = MyList(['a', 'b', 'c'])
>>> l.get(1)
'b'
>>> l.get(9, 'no')
'no'
Sie können auch eine kleine Hilfsfunktion für diese Fälle definieren:
def default(x, e, y):
try:
return x()
except e:
return y
Es gibt den Rückgabewert der Funktion x
zurück, es sei denn, es wurde eine Ausnahme vom Typ e
ausgelöst. In diesem Fall wird der Wert y
zurückgegeben. Verwendung:
b = default(lambda: a[4], IndexError, 'sss')
Bearbeiten: Es wurde nur ein bestimmter Ausnahmetyp abgefangen.
Verbesserungsvorschläge sind weiterhin willkommen!
In einem allgemeinen Fall, in dem Sie das erste Element benötigen, können Sie dies tun
next(iter([1, 2, 3]), None)
Ich benutze dies, um eine Liste "auszupacken", möglicherweise nachdem ich sie gefiltert habe.
next((x for x in [1, 3, 5] if x % 2 == 0), None)
oder
cur.execute("SELECT field FROM table")
next(cur.fetchone(), None)
try:
b = a[4]
except IndexError:
b = 'sss'
Eine sauberere Methode (funktioniert nur, wenn Sie ein Diktat verwenden):
b = a.get(4,"sss") # exact same thing as above
Hier ist ein anderer Weg, den du vielleicht magst (wieder nur für Dikte):
b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss"
Ich bin nur dafür, um Erlaubnis zu bitten (d. H. Ich mag die try
… except
-Methode nicht). Der Code wird jedoch viel sauberer, wenn er in eine Methode eingekapselt ist:
def get_at(array, index, default):
if index < 0: index += len(array)
if index < 0: raise IndexError('list index out of range')
return array[index] if index < len(a) else default
b = get_at(a, 4, 'sss')
Da dies ein Top-Google-Hit ist, ist es wahrscheinlich auch erwähnenswert, dass das Standardpaket "collections" ein "defaultdict" enthält, das eine flexiblere Lösung für dieses Problem bietet.
Sie können ordentliche Dinge tun, zum Beispiel:
twodee = collections.defaultdict(dict)
twodee["the horizontal"]["the vertical"] = "we control"
Lesen Sie mehr: http://docs.python.org/2/library/collections.html
Wenn Sie nach einer verwaltbaren Methode suchen, um Standardwerte für den Indexoperator abzurufen, hat sich Folgendes als nützlich erwiesen:
Wenn Sie operator.getitem
Vom Bedienermodul überschreiben, um einen optionalen Standardparameter hinzuzufügen, erhalten Sie dasselbe Verhalten wie beim Original, wobei die Abwärtskompatibilität erhalten bleibt.
def getitem(iterable, index, default=None):
import operator
try:
return operator.getitem(iterable, index)
except IndexError:
return default
Verwenden Sie try/catch?
try:
b=a[4]
except IndexError:
b='sss'
Wenn Sie nach einem schnellen Hack suchen, um die Codelänge zeichenweise zu reduzieren, können Sie dies versuchen.
a=['123','2',4]
a.append('sss') #Default value
n=5 #Index you want to access
max_index=len(a)-1
b=a[min(max_index, n)]
print(b)
Dieser Trick ist jedoch nur dann nützlich, wenn Sie die Liste nicht mehr weiter bearbeiten möchten