计算忽略重复项的特定字符数:Python

时间:2017-10-22 07:31:01

标签: python

我有这样的输入:BFFBFBFFFBFBBBFBBBBFF。 我想算上B'答案应该是6.(忽略重复的那些)

如何在python中完成?

7 个答案:

答案 0 :(得分:2)

使用itertools.groupby

>>> 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