在Python中获取索引的默认值超出范围[重复]

问题描述 投票:67回答:13

这个问题在这里已有答案:

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

我希望在列表索引超出范围时获取默认值(此处:'sss')。

我怎样才能做到这一点?

python list syntax default-value
13个回答
86
投票

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

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

1
投票

由于这是一个热门的谷歌热门,它可能也值得一提的是标准的“集合”软件包有一个“defaultdict”,它为这个问题提供了更灵活的解决方案。

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

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

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


1
投票

如果您正在寻找一种可维护的方法来获取索引运算符的默认值,我发现以下内容非常有用:

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

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

0
投票

使用try / catch?

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

0
投票

如果您正在寻找快速破解以减少代码长度的方法,那么您可以试试这个。

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)

但是这个技巧仅在您不再需要对列表进行进一步修改时才有用


58
投票

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

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

21
投票

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

代码高尔夫方法,使用切片和解包(不确定这是否在4年前有效,但它在python 2.7 + 3.3中)

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

比包装函数更好,或者尝试捕获恕我直言,但对于初学者来说是令人生畏的。就个人而言,我发现元组拆包比列表更性感[#]

使用切片而不解压缩:

b = a[4] if a[4:] else 'sss'

或者,如果你经常这样做,并且不介意制作字典

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

15
投票

其他方式:

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

13
投票

您可以创建自己的列表类:

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'

5
投票

您还可以为这些情况定义一个小帮助函数:

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

它返回函数x的返回值,除非它引发类型为e的异常;在这种情况下,它返回值y。用法:

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

编辑:使它只捕获一种指定类型的异常。

仍然欢迎提出改进建议!


5
投票

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

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)

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

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

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

这是你可能想要的另一种方式(同样,仅针对dicts):

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

1
投票

我都是要求许可(即我不喜欢try ... except方法)。但是,当它封装在一个方法中时,代码会变得更加清晰:

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')
© www.soinside.com 2019 - 2024. All rights reserved.