Question :
a=['123','2',4]
b=a[4] or 'sss'
print b
I want to get a default value when the list index is out of range (here: 'sss'
).
How can I do this?
Answer #1:
In the Python spirit of “ask for forgiveness, not permission”, here’s one way:
try:
b = a[4]
except IndexError:
b = 'sss'
Answer #2:
In the non-Python spirit of “ask for permission, not forgiveness”, here’s another way:
b = a[4] if len(a) > 4 else 'sss'
Answer #3:
In the Python spirit of beautiful is better than ugly
Code golf method, using slice and unpacking (not sure if this was valid 4 years ago, but it is in python 2.7 + 3.3)
b,=a[4:5] or ['sss']
Nicer than a wrapper function or try-catch IMHO, but intimidating for beginners. Personally I find tuple unpacking to be way sexier than list[#]
using slicing without unpacking:
b = a[4] if a[4:] else 'sss'
or, if you have to do this often, and don’t mind making a dictionary
d = dict(enumerate(a))
b=d.get(4,'sss')
Answer #4:
another way:
b = (a[4:]+['sss'])[0]
Answer #5:
You could create your own list-class:
class MyList(list):
def get(self, index, default=None):
return self[index] if len(self) > index else default
You can use it like this:
>>> l = MyList(['a', 'b', 'c'])
>>> l.get(1)
'b'
>>> l.get(9, 'no')
'no'
Answer #6:
For a common case where you want the first element, you can do
next(iter([1, 2, 3]), None)
I use this to “unwrap” a list, possibly after filtering it.
next((x for x in [1, 3, 5] if x % 2 == 0), None)
or
cur.execute("SELECT field FROM table")
next(cur.fetchone(), None)
Answer #7:
You could also define a little helper function for these cases:
def default(x, e, y):
try:
return x()
except e:
return y
It returns the return value of the function x
, unless it raised an exception of type e
; in that case, it returns the value y
. Usage:
b = default(lambda: a[4], IndexError, 'sss')
Edit: Made it catch only one specified type of exception.
Suggestions for improvement are still welcome!
Answer #8:
try:
b = a[4]
except IndexError:
b = 'sss'
A cleaner way (only works if you’re using a dict):
b = a.get(4,"sss") # exact same thing as above
Here’s another way you might like (again, only for dicts):
b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss"