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

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

当前回答

这不是一个非常通用的解决方案,但我有一个情况,我需要一个长度为3到5的列表(有一个保护if),并且我将值分解为命名变量。我找到了一个简单而简洁的方法:

foo = (argv + [None, None])[3]
bar = (argv + [None, None])[4]

现在foo和bar是列表中的第4和第5个值,如果没有那么多值,则为None。

其他回答

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

my_list。get(指数(默认)

as

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

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

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

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

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

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

你可以做的一件合理的事情是将列表转换为字典,然后用get方法访问它:

>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> my_dict = dict(enumerate(my_list))
>>> print my_dict
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}
>>> my_dict.get(2)
'c'
>>> my_dict.get(10, 'N/A')

试试这个:

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

字典是用来查资料的。询问条目是否存在是有意义的。列表通常是迭代的。通常不会问L[10]是否存在,而是问L的长度是否为11。