为什么list没有像字典一样安全的"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
发布于 2011-02-26 15:23:05
归根结底,它可能没有安全的.get
方法,因为dict
是一个关联集合(值与名称相关联),在这种集合中,在不抛出异常的情况下检查键是否存在(并返回它的值)效率很低,而避免访问列表元素的异常非常简单(因为len
方法非常快)。.get
方法允许您查询与名称相关联的值,而不是直接访问字典中的第37个条目(这更像是您对列表的要求)。
当然,您可以很容易地自己实现此功能:
def safe_list_get (l, idx, default):
try:
return l[idx]
except IndexError:
return default
您甚至可以将其附加到__main__
中的__builtins__.list
构造函数中,但这将是一个不太普遍的更改,因为大多数代码都不使用它。如果您只是想将其与您自己的代码创建的列表一起使用,则可以简单地将list
子类化并添加get
方法。
发布于 2014-04-11 12:56:54
如果您想要第一个元素,比如my_list.get(0)
,这是可行的
>>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'
我知道这不完全是你想要的,但它可能会对其他人有所帮助。
发布于 2011-02-26 15:40:37
可能是因为它对列表语义没有多大意义。但是,您可以通过子类化轻松地创建自己的。
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()
https://stackoverflow.com/questions/5125619
复制相似问题