Pythonic获取数组元素或默认值

2 投票
3 回答
548 浏览
提问于 2025-04-16 19:03

我们有

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]

撰写回答