为什么列表没有像字典一样安全的“获取”方法?
>>> 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
为什么列表没有像字典一样安全的“获取”方法?
>>> 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
当前回答
试试这个:
>>> i = 3
>>> a = [1, 2, 3, 4]
>>> next(iter(a[i:]), 'fail')
4
>>> next(iter(a[i + 1:]), 'fail')
'fail'
其他回答
可能是因为它对列表语义没有多大意义。但是,您可以通过子类化轻松创建自己的子类。
class safelist(list):
def get(self, index, default=None):
try:
return self.__getitem__(index)
except IndexError:
return default
def _test():
l = safelist(range(10))
print l.get(20, "oops")
if __name__ == "__main__":
_test()
如果你想要第一个元素,比如my_list.get(0)
>>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'
我知道这不是你想要的但也许能帮到别人。
这要归功于乔斯·安吉尔·希门尼斯和古斯·巴斯。
对于“在线”的粉丝们…
如果你想要列表的第一个元素,或者如果你想要一个默认值,如果列表是空的,尝试:
liste = ['a', 'b', 'c']
value = (liste[0:1] or ('default',))[0]
print(value)
返回一个
and
liste = []
value = (liste[0:1] or ('default',))[0]
print(value)
返回默认
其他元素的例子…
liste = ['a', 'b', 'c']
print(liste[0:1]) # returns ['a']
print(liste[1:2]) # returns ['b']
print(liste[2:3]) # returns ['c']
print(liste[3:4]) # returns []
默认的回退…
liste = ['a', 'b', 'c']
print((liste[0:1] or ('default',))[0]) # returns a
print((liste[1:2] or ('default',))[0]) # returns b
print((liste[2:3] or ('default',))[0]) # returns c
print((liste[3:4] or ('default',))[0]) # returns default
可能短:
liste = ['a', 'b', 'c']
value, = liste[:1] or ('default',)
print(value) # returns a
看起来你需要在等号前加逗号,等号和后面的括号。
更普遍的:
liste = ['a', 'b', 'c']
f = lambda l, x, d: l[x:x+1] and l[x] or d
print(f(liste, 0, 'default')) # returns a
print(f(liste, 1, 'default')) # returns b
print(f(liste, 2, 'default')) # returns c
print(f(liste, 3, 'default')) # returns default
使用Python 3.6.0进行测试(v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
字典是用来查资料的。询问条目是否存在是有意义的。列表通常是迭代的。通常不会问L[10]是否存在,而是问L的长度是否为11。
对于较小的索引值,您可以实现
my_list。get(指数(默认)
as
(my_list + [default] * (index + 1))[index]
如果你事先知道下标是什么,那么这个可以简化,例如,如果你知道它是1,那么你可以这样做
(my_list + [default, default])[index]
因为列表是向前打包的,所以我们需要担心的唯一失败情况是运行到列表的末尾。这种方法用足够的默认值填充列表的末尾,以确保索引被覆盖。