0

是否有从列表中获取项目但返回默认值超出范围的标准方法?

举个例子,我现在有一个这样的函数(嗯,有很多变种,我最新的是用于读取 CSV 文件):

def list_get_def( lst, ndx, def_val ):
  if ndx >= len(lst):
    return def_val
  return lst[ndx]
4

2 回答 2

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'

此处的一个类似问题讨论了为什么列表没有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'
于 2013-07-18T11:08:38.910 回答
0

如果您不想覆盖列表的 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。

于 2013-07-18T11:08:38.977 回答