这个看似简单的问题正在困扰我一段时间,以为有人可能会有所帮助。
我有一个简单的字符串
s = 'AAABCAA'
如何查找第一个字母“ A”的重复次数? 答案应该是3。
我尝试过:
from collections import Counter
c = Counter(s)
但是,这给出的是'A'= 5,而不是3。
答案 0 :(得分:5)
您可以使用带有break语句的for循环。
s = 'AAABCAA'
counter=0
firstletter=s[0]
for each in s:
if each==firstletter:
counter+=1
else:
break
print(counter)
这只会返回3
。
或者,您可以返回字符串的第一个元素的索引,该索引与字符串的第一个字符不同:
import numpy as np
s = 'AAABCAA'
firstletter=s[0]
checklist=[(each==firstletter)*1 for each in s]
print(np.where(np.asarray(checklist)==0)[0][0])
在这种情况下,使用列表理解([(each==firstletter)*1 for each in s]
),我们会生成一个列表:
[1, 1, 1, 0, 0, 1, 1]
无论该位置的字符与字符串的第一个字符相同,其值为1
。
然后,np.where(np.asarray(checklist)==0)[0][0]
会给您这个新创建的列表的第一个0
(即第一个字符与起始字符不同)的索引。
答案 1 :(得分:4)
您可以使用函数groupby()
查找所有字母组,然后可以使用next()
从迭代器中获取第一个字母组:
from itertools import groupby
s = 'AAABCAA'
sum(1 for _ in next(groupby(s))[1])
# 3
或者,您可以使用函数takewhile()
:
from itertools import takewhile
sum(1 for _ in takewhile(lambda x: x == s[0], s))
# 3
最后您可以使用正则表达式:
import re
len(re.search(r'^(\w)\1+', s, flags=re.MULTILINE).group(0))
# 3
答案 2 :(得分:3)
这是一个使用列表补偿的简短解决方案。当然,可读性不是这里的目标:)
repetitions = lambda str, letter: [i + 1 for i, num in enumerate(str) if num == letter][-1]
示例:
str = 'BBBBC'
letter = 'B'
repetitions(str, letter) # 4
str = 'AABC'
letter = 'A'
repetitions(str, letter) # 2
答案 3 :(得分:1)
如果通常要在字符串中查找模式,请使用suffix tree。