为什么列表没有像字典一样安全的“获取”方法?

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

当前回答

如果你想要第一个元素,比如my_list.get(0)

>>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'

我知道这不是你想要的但也许能帮到别人。

其他回答

对于较小的索引值,您可以实现

my_list。get(指数(默认)

as

(my_list + [default] * (index + 1))[index]

如果你事先知道下标是什么,那么这个可以简化,例如,如果你知道它是1,那么你可以这样做

(my_list + [default, default])[index]

因为列表是向前打包的,所以我们需要担心的唯一失败情况是运行到列表的末尾。这种方法用足够的默认值填充列表的末尾,以确保索引被覆盖。

您的用例基本上只与处理固定长度的数组和矩阵相关,以便您事先知道它们有多长。在这种情况下,通常还需要在手动填充None或0之前创建它们,这样实际上您将使用的任何索引都已经存在。

你可以说:我经常需要在字典上查找.get()。在做了十年的全职程序员之后,我认为我不需要把它列在清单上。:)

如果你想要第一个元素,比如my_list.get(0)

>>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'

我知道这不是你想要的但也许能帮到别人。

不要使用.get,像这样使用列表应该是可以的。只是用法上的不同。

>>> l = [1]
>>> l[10] if 10 < len(l) else 'fail'
'fail'

试试这个:

>>> i = 3
>>> a = [1, 2, 3, 4]
>>> next(iter(a[i:]), 'fail')
4
>>> next(iter(a[i + 1:]), 'fail')
'fail'