wake-up-neo.com

Abrufen eines Standardwerts für den Index außerhalb des Bereichs in Python

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?

69
zjm1126

Im Python Geist von "Bitte um Vergebung, nicht um Erlaubnis", hier ist eine Möglichkeit:

try:
    b = a[4]
except IndexError:
    b = 'sss'
86
Thomas

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'
58
Thomas

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')
21
00500005

ein anderer Weg:

b = (a[4:]+['sss'])[0]
15
maep

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'
13
gecco

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!

5
Thomas

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)
5
Pepijn
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"
3
Vlad the Impala

Ich bin nur dafür, um Erlaubnis zu bitten (d. H. Ich mag die tryexcept -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')
1
Konrad Rudolph

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

1
Jonathan Mayer

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
1
Alex

Verwenden Sie try/catch?

try:
    b=a[4]
except IndexError:
    b='sss'
0
zoli2k

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

0
Vikas Kumar