是否有标准方法从列表中获取项目但返回默认值是否超出范围?
就像一个例子我现在有这样的功能(好吧,这个的很多变种,我的最新版本是读取CSV文件):
def list_get_def( lst, ndx, def_val ):
if ndx >= len(lst):
return def_val
return lst[ndx]
答案 0 :(得分:3)
使用try-except
块并抓住IndexError
。
>>> def testFunc(lst, index):
try:
return lst[index]
except IndexError:
return "abc"
>>> testFunc([1, 2, 3], 2)
3
>>> testFunc([1, 2, 3], 9)
'abc'
类似的问题here讨论了为什么列表没有像词典那样的get
方法。
如果您确实想要使用if
语句,则只需使用一行代码即可。
>>> def testFunc(lst, index):
return lst[index] if index < len(lst) else "abc"
>>> testFunc([1, 2, 3], 2)
3
>>> testFunc([1, 2, 3], 9)
'abc'
答案 1 :(得分:0)
如果您不想覆盖列表的getimtem,可以编写像dict这样的get方法:
class fancyList_if(list):
def get(self, index, default = None):
if (index > len(self)):
return default
return self.__getitem__(index)
如果您很少想要超出界限,那么您可以将其实现为例外
class fancyList_except(list):
def get(self, index, default = None):
try:
self.__getitem__(index)
except IndexError:
return default
<强> benshmarks:强>
In [58]: a = fancyList_if((1,3,4,5))
In [59]: b = fancyList_except((1,3,4,5))
In [60]: %timeit a.get(2, 10)
1000000 loops, best of 3: 494 ns per loop
In [61]: %timeit a.get(10, 10)
1000000 loops, best of 3: 305 ns per loop
In [62]: %timeit b.get(2, 10)
1000000 loops, best of 3: 409 ns per loop
In [63]: %timeit b.get(10, 10)
1000000 loops, best of 3: 1.67 us per loop
收支平衡:
500hit + 300miss = 400hit + 1700miss
hit / miss = 14
所以,如果你期望14个中有超过1个查找'失败',那么使用if语句,否则使用try / catch。