越界列表索引的默认值

时间:2013-07-18 11:07:42

标签: python python-2.7

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

就像一个例子我现在有这样的功能(好吧,这个的很多变种,我的最新版本是读取CSV文件):

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

2 个答案:

答案 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。