a = ['123', '2', 4]
b = a[4] or 'sss'
print b
当列表索引超出范围时,我希望得到一个默认值(这里是'sss'
)。
我该怎么做?
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'
try/except
。虽然从其他语言转换过来可能会感到不寻常,但没有理由认为异常是某种关键错误,特别是如果你预料到它的发生。你可能有一行代码可能会遭受KeyError
和IndexError
等多种异常,通过使用几个异常处理程序,你可以清晰快速地处理所有这些异常。这有时可以避免嵌套的if/then/else
语句反复测试DivideByZero
和其他类似的边缘情况。 - NeilGtry/except
的原因是为了保持代码的整洁。在我看来,过多的尝试会使整个算法显得冗长而不必要。如今,我同意标准建议是一个不错的选择,但仍然会使用许多像这样的一行语句。 - Thiago Macedo遵循Python的美丽胜于丑陋精神
使用切片和解包技巧的代码高尔夫方法(不确定这在4年前是否有效,但在Python 2.7 + 3.3中是有效的)
b, = a[4:5] or ['sss']
个人认为比包装函数或try-catch更好,但对于初学者来说有些吓人。
使用切片而不解压:
b = a[4] if a[4:] else 'sss'
或者,如果您需要经常这样做,并且不介意制作一个词典
d = dict(enumerate(a))
b = d.get(4, 'sss')
a[4:5]
也不再好用了... - Robert Siemerb,=a[4:] or 'sss',
与b=a[4:] or 'sss'
是相同的。 - north.misterb=[*a[4:],'sss'][0]
- mabel另一种方法:
b = (a[4:]+['sss'])[0]
a[4:]
创建一个元素列表,从(包括)索引4开始。这将导致一个空列表。[1, 2, 3][999:] == []
这就是切片操作的工作方式。如果a
是 ['123', '2', 4, 5, 6]
,它会返回 [5, 6]。然后他添加了元素 'sss',创建了一个新的列表,在这种情况下是['sss']
。最后一步 [0]
只取第一个元素,因此返回 'sss'
,但如果有这样的元素,它将返回 a[4]
。 - vlad-ardelean4 in a
询问列表中是否存在值为 4
,而不是键! - yo'你可以创建自己的列表类:
class MyList(list):
def get(self, index, default=None):
return self[index] if -len(self) <= index < len(self) else default
>>> l = MyList(['a', 'b', 'c'])
>>> l.get(1)
'b'
>>> l.get(9, 'no')
'no'
l.get(-12)
-> IndexError: list index out of range
- Eric Duminilreturn self[index] if -len(self) <= index < len(self) else default
替代。 - Jav如果您想要获取第一个元素,可以使用以下方式:
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)
def default(x, e, y):
try:
return x()
except e:
return y
如果函数x
没有引发类型为e
的异常,则返回函数的返回值;否则返回值y
。用法:
b = default(lambda: a[4], IndexError, 'sss')
编辑:仅捕获指定类型的异常。
欢迎提出改进建议!
except
令人担忧。 - Eli Benderskytry:
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"
我完全赞成征求许可(即不喜欢使用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')
mylist[-1]
应该只获取最后一个元素,但是你的“请求许可”的 get_at
代码并不像那样行为。这显示了“请求许可”是错误哲学的众多原因之一:你检查的东西可能与系统要做的不匹配。也就是说,你不仅在系统为你完成的工作上系统地尝试复制工作,而且你很容易把那个额外的、重复的工作搞错。“请求宽恕”要好得多。 - Alex Martellidef get_at(array, index, default): try: return array[index] except IndexError: return default
,你应该能够避免错误。 - Esteban Küberdef getitem(iterable, index, default=None):
import operator
try:
return operator.getitem(iterable, index)
except IndexError:
return default