Pythonic获取数组元素或默认值
我们有
matches = re.findall(r'somewhat', 'somewhere')
我们能不能简化这个
if len(matches) > index:
return matches[index]
else:
return 'default'
或者
return matches[index] if len(mathes) > index else 'default'
变成类似于JS的
return matches[index] || 'default'
这样我们就可以简单使用了
return 'somewhere'.match(/somewhat/)[index] || 'default'
3 个回答
0
其实不是这样的,因为如果你用一个无效的索引去运行 mathes[x]
,会出现一个 IndexError
错误,这个错误不会返回 False
。
1
我会考虑使用一个“尝试-捕获”块。不过,你需要考虑一下索引为负数的情况。这是一个错误,还是可以接受的输入呢?
不过,下面的代码是可以工作的:
try:
return re.findall(r'somewhat', 'somewhere')[index]
except IndexError:
return 'default'
如果你关心效率,这种方法是比较推荐的,因为它避免了两次检查数组的边界(一次是你手动检查,另一次是Python内部自动检查)。
补充一下:我其实不太喜欢这种方法,因为它会隐藏掉由子调用引发的索引错误,并且会返回一个默认值(我怀疑这不是你想要的行为,可能会导致一些bug)。
4
像这样的内容可能会对你有帮助:
>>> reg = re.compile('-\d+-')
>>> reg.findall('a-23-b-12-c') or ['default']
['-23-', '-12-']
>>> reg.findall('a-b-c') or ['default']
['default']
编辑
这是一行看起来不太美观的代码
(reg.findall('a-b-c')[index:] or ['default'])[0]