为什么列表没有像字典一样安全的“获取”方法?
>>> 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
当前回答
字典是用来查资料的。询问条目是否存在是有意义的。列表通常是迭代的。通常不会问L[10]是否存在,而是问L的长度是否为11。
其他回答
Ultimately it probably doesn't have a safe .get method because a dict is an associative collection (values are associated with names) where it is inefficient to check if a key is present (and return its value) without throwing an exception, while it is super trivial to avoid exceptions accessing list elements (as the len method is very fast). The .get method allows you to query the value associated with a name, not directly access the 37th item in the dictionary (which would be more like what you're asking of your list).
当然,你可以很容易地实现自己:
def safe_list_get (l, idx, default):
try:
return l[idx]
except IndexError:
return default
你甚至可以monkeypatch它到__builtins__。__main__中的列表构造函数,但这将是一个不太普遍的变化,因为大多数代码不使用它。如果你只是想用你自己的代码创建的列表使用这个,你可以简单地子类list并添加get方法。
字典是用来查资料的。询问条目是否存在是有意义的。列表通常是迭代的。通常不会问L[10]是否存在,而是问L的长度是否为11。
可能是因为它对列表语义没有多大意义。但是,您可以通过子类化轻松创建自己的子类。
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()
不要使用.get,像这样使用列表应该是可以的。只是用法上的不同。
>>> l = [1]
>>> l[10] if 10 < len(l) else 'fail'
'fail'
您的用例基本上只与处理固定长度的数组和矩阵相关,以便您事先知道它们有多长。在这种情况下,通常还需要在手动填充None或0之前创建它们,这样实际上您将使用的任何索引都已经存在。
你可以说:我经常需要在字典上查找.get()。在做了十年的全职程序员之后,我认为我不需要把它列在清单上。:)