为什么不列表有像字典一样安全的“get”方法?

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

最终,它可能没有安全的.get方法,因为dict是一个关联集合(值与名称相关联),在检查一个键是否存在(并返回它的值)而不引发exception的情况下,是非常平凡的,以避免exception访问列表元素(因为len方法非常快)。 .get方法允许你查询与名字相关的值,而不是直接访问字典中的第37项(这更像是你要求的列表)。

当然,你可以很容易地实现这一点:

 def safe_list_get (l, idx, default): try: return l[idx] except IndexError: return default 

你甚至可以把它修改到__main____builtins__.list构造函数中,但是由于大多数代码不使用它,所以这是一个不太普遍的改变。 如果你只是想用你自己的代码创build的list ,你可以简单地list子类并添加get方法。

而不是使用.get,像这样使用应该可以用于列表。 只是一个使用差异。

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

这工作,如果你想要的第一个元素,如my_list.get(0)

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

我知道这不是你要求的,但它可能会帮助别人。

可能是因为它对列表语义没有多大意义。 但是,您可以通过inheritance来轻松创build自己的。

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

尝试这个:

 >>> i = 3 >>> a = [1, 2, 3, 4] >>> next(iter(a[i:]), 'fail') 4 >>> next(iter(a[i + 1:]), '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') 

学分给jose.angel.jimenez


对于“oneliner”粉丝…


如果你想要一个列表的第一个元素,或者如果你想要一个默认值,如果列表是空的尝试:

 liste = ['a', 'b', 'c'] value = (liste[0:1] or ('default',))[0] print(value) 

返回a

 liste = [] value = (liste[0:1] or ('default',))[0] print(value) 

返回default


其他元素的例子…

 liste = ['a', 'b', 'c'] print(liste[0:1]) # returns ['a'] print(liste[1:2]) # returns ['b'] print(liste[2:3]) # returns ['c'] 

使用默认的后备…

 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 

Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)testingPython 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)

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

所以我做了一些更多的研究,结果没有什么特别的。 当我findlist.index(value)时,我很兴奋,它返回指定项目的索引,但是没有任何东西可以获取特定索引处的值。 所以如果你不想使用safe_list_get解决scheme,我认为它很好。 这里是一些class轮,如果可以根据情况为你完成工作的陈述:

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

你也可以把它们变成函数,但我仍然喜欢IndexErrorexception解决scheme。 我尝试了一个简单的safe_list_get解决scheme,并使其更简单一些(没有默认):

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

没有基准来看看什么是最快的。

你的用例基本上只与做一个固定长度的数组和matrix有关,所以你知道他们在多久之前。 在这种情况下,您通常也会在用“None”或“0”填充它们之前创build它们,以便实际上您将使用的任何索引都已经存在。

你可以这样说:我经常需要在字典上使用.get()。 作为一个全职程序员十年后,我不认为我曾经需要它在名单上。 🙂