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

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

当前回答

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

其他回答

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

你可以做的一件合理的事情是将列表转换为字典,然后用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')

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

my_list。get(指数(默认)

as

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

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

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

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

如果你

想要一个眼线, 宁愿不使用try /,除非在您不需要的代码路径中 想要默认值为可选的,

你可以用这个:

list_get = lambda l, x, d=None: d if not l[x:x+1] else l[x]

用法如下:

>>> list_get(['foo'], 4) == None
True
>>> list_get(['hootenanny'], 4, 'ho down!')
'ho down!'
>>> list_get([''], 0)
''

所以我对此做了更多的研究,结果是没有什么特别的东西。当我找到list.index(value)时,我很兴奋,它返回指定项的索引,但没有任何东西用于获取特定索引的值。如果你不想使用safe_list_get解决方案,我认为这很好。下面是一些if语句,它们可以根据场景帮助你完成工作:

>>> x = [1, 2, 3]
>>> el = x[4] if len(x) > 4 else 'No'
>>> el
'No'

你也可以用None来代替No,这样更有意义。

>>> x = [1, 2, 3]
>>> i = 2
>>> el_i = x[i] if len(x) == i+1 else None

同样,如果您只想获取列表中的第一项或最后一项,也可以这样做

end_el = x[-1] if x else None

你也可以把它们变成函数,但是我仍然喜欢IndexError异常解决方案。我尝试了safe_list_get解决方案的简化版本,并使其更简单(没有默认值):

def list_get(l, i):
    try:
        return l[i]
    except IndexError:
        return None

还没有基准测试,看看什么是最快的。