我想在字符串中找到最后一次出现的字符。
str.rfind()将给出字符串中单个字符最后一次出现的索引,但我需要最后一次出现多个字符的索引。例如,如果我有一个字符串:
test_string = '([2+2])-[3+4])'
我想要一个函数返回{,[,或{类似于
的最后一次出现的索引test_string.rfind('(', '[', '{')
理想情况下会返回8.最好的方法是什么?
max(test_string.rfind('('), test_string.rfind('['), test_string.rfind('{'))
似乎笨重而不是Pythonic。
答案 0 :(得分:6)
您可以使用生成器表达式以Pythonic方式执行此操作。
max(test_string.rfind(i) for i in "([{")
这将迭代您要检查的字符列表/元组,并对它们使用rfind()
,将这些值组合在一起,然后返回最大值。
答案 1 :(得分:1)
这非常简洁,并且可以解决问题。
max(map(test_string.rfind, '([{'))
答案 2 :(得分:1)
你可以使用reverse来获取第一个匹配的字符串的结尾,使用字符串-1的长度 - 索引i
来获取索引从头开始计数,最坏的情况是单个传递字符串:
test_string = '([2+2])-[3+4])'
st = {"[", "(", "{"}
print(next((len(test_string) - 1 - i
for i, s in enumerate(reversed(test_string)) if s in st),-1))
8
如果没有匹配项,您将获得-1
作为默认值。如果您要搜索大量的子字符串,而不是为要匹配的每个子字符串执行O(n)
rfind,然后获取所有这些子字符串的最大值,则效率会更高
答案 3 :(得分:0)
>>> def last_of_many(string, findees):
... return max(string.rfind(s) for s in findees)
...
>>> test_string = '([2+2])-[3+4])'
>>> last_of_many(test_string, '([{')
8
>>> last_of_many(test_string, ['+4', '+2'])
10
>>>