在Python中获取索引超出范围的默认值

a=['123','2',4] b=a[4] or 'sss' print b 

当列表索引超出范围(这里: 'sss' )时,我想得到一个默认值。

我怎样才能做到这一点?

在“请求宽恕,不允许”的Python精神中,这里有一个方法:

 try: b = a[4] except IndexError: b = 'sss' 

在“请求许可而不是宽恕”的非Python精神中,这是另一种方式:

 b = a[4] if len(a) > 4 else 'sss' 

在Python中,美丽的精神胜过丑陋

代码高尔夫方法,使用切片和解包

 b=a[4:4+1] or 'sss' 

比包装函数更好或尝试捕捉恕我直言,但威胁初学者。 就我个人而言,我发现元组开箱比列表[#]

使用切片而不拆包:

 b,=a[4:5] or ['sss'] 

或者,如果你经常这样做,并不介意做一本字典

 d = dict(enumerate(a)) b=d.get(4,'sss') 

你可以创build自己的列表类:

 class MyList(list): def get(self, index, default=None): return self[index] if len(self) > index else default 

你可以像这样使用它:

 >>> l = MyList(['a', 'b', 'c']) >>> l.get(1) 'b' >>> l.get(9, 'no') 'no' 

其他方式:

 b = (a[4:]+['sss'])[0] 

你也可以为这些情况定义一个辅助函数:

 def default(x, e, y): try: return x() except e: return y 

它返回函数x的返回值,除非它引发了etypes的exception; 在这种情况下,它返回值y 。 用法:

 b = default(lambda: a[4], IndexError, 'sss') 

编辑 :让它只捕获一个指定types的exception。

改善build议仍然欢迎!

 try: b = a[4] except IndexError: b = 'sss' 

一个更干净的方式(只有在使用字典时才有效):

 b = a.get(4,"sss") # exact same thing as above 

下面是你可能喜欢的另一种方式(再次,只用于字典):

 b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss" 

我都是要求允许的(即我不喜欢tryexcept方法)。 但是,当代码被封装在一个方法中时,代码会变得更清晰:

 def get_at(array, index, default): if index < 0: index += len(array) if index < 0: raise IndexError('list index out of range') return array[index] if index < len(a) else default b = get_at(a, 4, 'sss') 

对于需要第一个元素的常见情况,可以这样做

 next(iter([1, 2, 3]), None) 

我用它来“解开”一个列表,可能在过滤之后。

 next((x for x in [1, 3, 5] if x % 2 == 0), None) 

要么

 cur.execute("SELECT field FROM table") next(cur.fetchone(), None) 

使用try / catch?

 try: b=a[4] except IndexError: b='sss' 

由于这是谷歌的热门search,所以也许值得一提的是,标准的“collections”软件包有一个“defaultdict”,为这个问题提供了一个更加灵活的解决scheme。

你可以做一些整洁的事情,例如:

 twodee = collections.defaultdict(dict) twodee["the horizontal"]["the vertical"] = "we control" 

阅读更多: http : //docs.python.org/2/library/collections.html

如果你正在寻找一个在索引操作符上获得默认值的可维护方法,我发现以下有用的:

如果从操作员模块中覆盖operator.getitem以添加可选的默认参数,则在保持向下兼容性的同时,您将获得与原始操作相同的行为。

 def getitem(iterable, index, default=None): import operator try: return operator.getitem(iterable, index) except IndexError: return default 

如果你正在寻找一个简单的方法来减less代码长度,你可以试试这个。

 a=['123','2',4] a.append('sss') #Default value n=5 #Index you want to access max_index=len(a)-1 b=a[min(max_index, n)] print(b) 

但是这个技巧只有当你不再需要进一步修改列表时才有用