我想找到字符串中任何“特殊”字符第一次出现的索引,如下所示:
>>> "Hello world!".index([' ', '!'])
5
…但那不是有效的Python语法。当然,我可以编写一个模拟此行为的函数:
def first_index(s, characters):
i = []
for c in characters:
try:
i.append(s.index(c))
except ValueError:
pass
if not i:
raise ValueError
return min(i)
我也可以使用正则表达式,但这两种解决方案似乎都有点过头了。在Python中有什么“理智”的方法可以做到这一点吗?
使用gen exp和^{} 方法。
若要删除出现的
-1
s,可以在列表组件中使用筛选器或者你可以用
None
添加
timeit
结果在你的例子中,Padraic的漂亮解决方案有点慢。然而,在大型测试用例中,它绝对是赢家。(有点奇怪的是,alfasin的“没有优化”在这里也更快)
添加了实现细节
在Padraic的例子中可以清楚地看到,加载全局函数
next
和enumerate
是与最后的None
一起消磨时间的函数。在alfasin的溶液中,主要的减慢是lambda
函数。我更喜欢
re
模块,因为它已经内置并测试过了。它也正是为这种事情而优化的。您可能希望检查是否找到匹配项,或者在没有找到匹配项时捕获异常。
不使用
re
是有原因的,但是我想看到一个很好的注释来证明rational的合理性。认为您可以“做得更好”通常是不必要的,这会使其他人更难阅读代码,并且不易维护。可以将enumerate和next与generator expression一起使用,获取第一个匹配项,如果在s中没有出现字符,则返回None:
如果没有匹配项,则可以将下一个要传递的任何值作为默认返回值。
如果要使用函数并引发值错误:
对于较小的输入,使用一个集合不会有太大的区别,但对于较大的字符串,它将是一个更有效的方法。
一些时间安排:
在字符串中,字符集的最后一个字符:
不在字符串中,较大的字符集:
在字符串中,字符集的第一个字符:
相关问题 更多 >
编程相关推荐