是否有从列表中获取项目但返回默认值超出范围的标准方法?
举个例子,我现在有一个这样的函数(嗯,有很多变种,我最新的是用于读取 CSV 文件):
def list_get_def( lst, ndx, def_val ):
if ndx >= len(lst):
return def_val
return lst[ndx]
是否有从列表中获取项目但返回默认值超出范围的标准方法?
举个例子,我现在有一个这样的函数(嗯,有很多变种,我最新的是用于读取 CSV 文件):
def list_get_def( lst, ndx, def_val ):
if ndx >= len(lst):
return def_val
return lst[ndx]
使用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'
此处的一个类似问题讨论了为什么列表没有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'
如果您不想覆盖列表的 getimtem,您可以编写一个 get 方法,如 dict 有:
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
基准:
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
命中/未命中 = 14
因此,如果您希望超过 14 个查找“失败”,则使用 if 语句,否则使用 try/catch。