我有这样的输入:BFFBFBFFFBFBBBFBBBBFF。 我想算上B'答案应该是6.(忽略重复的那些)
如何在python中完成?
答案 0 :(得分:2)
>>> from itertools import groupby
>>> l = [k for k,v in groupby(s)]
>>> l
=> ['B', 'F', 'B', 'F', 'B', 'F', 'B', 'F', 'B', 'F', 'B', 'F']
>>> l.count('B')
=> 6
#driver values:
IN : s = 'BFFBFBFFFBFBBBFBBBBFF
编辑另外,为了更广泛的使用,最好使用collections.Counter
获取所有字符的count
。
>>> from collections import Counter
>>> Counter(l)
=> Counter({'B': 6, 'F': 6})
答案 1 :(得分:2)
s = "BFFBFBFFFBFBBBFBBBBFF"
f = False
count = 0
for i in s:
if f and i == 'B':
continue
elif i == 'B':
count += 1
f = True
else:
f = False
print(count)
另一个
from itertools import groupby
count = 0
for i,_ in groupby(s):
if i == 'B':
count += 1
print(count)
答案 2 :(得分:1)
您应该设置一个计数器和一个标志变量。然后只计算不重复的出现次数,然后翻转标志。逻辑很简单:如果当前的字母是' B',那么你之前的字母不是' B' B' (dup = False),然后计算它+翻转布尔值:
s = 'BFFBFBFFFBFBBBFBBBBFF'
count = 0
dup = False
for l in s:
if l == 'B' and not dup:
count += 1
dup = True
elif l != 'B':
dup = False
# count: 6
答案 3 :(得分:1)
我们可以移除连续的重复项并使用collections.Counter
来计算剩下的B:
from collections import Counter
def remove_conseq_dups(s):
res = ""
for i in range(len(s)-1):
if s[i] != s[i+1]:
res+= s[i]
return res
s = "BFFBFBFFFBFBBBFBBBBFF"
print(Counter(remove_conseq_dups(s))['B']) # 6
一个groupby
解决方案:
from itertools import groupby
s = "BFFBFBFFFBFBBBFBBBBFF"
print(sum(map(lambda x: 1 if x == 'B' else 0, [x for x, v in groupby(s)])))
或者
print(len(list(filter(lambda x: x == 'B', [x for x, v in groupby(s)]))))
答案 4 :(得分:0)
另一种解决方案是首先使用RE库删除重复项:
import re
l1 = "BFFBFBFFFBFBBBFBBBBFF"
l2 = re.sub(r'([A-z])\1+', r'\1', l1) # Remove duplicates
l2.count("B") # 6
答案 5 :(得分:0)
当字母从F变为B时,您想要计算,而另一个函数可以这样做:split
。它会删除所有F,但为连续的F创建空字符串,因此我们必须将它们从计数中删除。
s = "BFFBFBFFFBFBBBFBBBBFF"
t = s.split('F')
n = sum([1 for b in t if len(b) > 0])
print(n)
答案 6 :(得分:0)
替代解决方案:
s = 'BFFBFBFFFBFBBBFBBBBFF'
l = [c for i,c in enumerate(s) if s[i-1] != c]
l.count('B') #or use counter
>>>6