为什么列表没有像字典一样安全的“获取”方法?
>>> 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
当前回答
可能是因为它对列表语义没有多大意义。但是,您可以通过子类化轻松创建自己的子类。
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()
其他回答
可能是因为它对列表语义没有多大意义。但是,您可以通过子类化轻松创建自己的子类。
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'
如果你想要第一个元素,比如my_list.get(0)
>>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'
我知道这不是你想要的但也许能帮到别人。
这不是一个非常通用的解决方案,但我有一个情况,我需要一个长度为3到5的列表(有一个保护if),并且我将值分解为命名变量。我找到了一个简单而简洁的方法:
foo = (argv + [None, None])[3]
bar = (argv + [None, None])[4]
现在foo和bar是列表中的第4和第5个值,如果没有那么多值,则为None。
字典是用来查资料的。询问条目是否存在是有意义的。列表通常是迭代的。通常不会问L[10]是否存在,而是问L的长度是否为11。