如何计算Python中二进制字符串中连续重复的1/0的块数

时间:2018-03-29 14:32:40

标签: python string binary

因此,例如,我希望代码为输入'01000110'返回'5',因为重复数字的块是'0','1','000','11','0'。我无法想出解决这个问题的方法。感谢所有帮助/评论。

3 个答案:

答案 0 :(得分:4)

您可以使用正则表达式。

(0+|1+)将匹配任何连续区域为1或0,然后您可以检查结果数组的长度。

import re

s = '01000110' 
print(len(re.findall(r'(0+|1+)', s)))    # ['0', '1', '000', '11', '0']

输出:

5

正如@John Coleman指出的那样,你也可以使用itertools,这对于大型二进制字符串来说会略微快一些:

len(list(itertools.groupby(s)))

时序:

In [18]: x = np.random.randint(2, size=100000)

In [19]: x = ''.join(map(str, x))

In [20]: %timeit len(re.findall(r'(0+|1+)', x))
10.9 ms ± 327 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [21]: %timeit len(list(itertools.groupby(x)))
9.42 ms ± 173 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [22]: %timeit sum(1 for i in itertools.groupby(x))
9.12 ms ± 156 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 1 :(得分:2)

itertools模块中的函数>>> len(list(itertools.groupby('01000110'))) 5 提供了一个自然的解决方案:

len(list())

正如@chrisz指出的那样,将sum()替换为days_of_week=['sun','mon','tues','wednes','thurs','fri','satur'] print(days_of_week) i=0 while i<=6: days_of_week[i].title() i+=1 print(days_of_week) ,可以略微加快这一速度。

答案 2 :(得分:0)

给出长度为l的0和1的列表

array = numpy.random.randint(0, 2, (l))

此代码给出了连续区域的数量(未优化,只是为了显示概念)

count = 1
current_digit = array[0]
for digit in array:
    if digit != current_digit:
        count += 1
        current_digit = digit
count

例如,

array = [0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0]

区域数量

count = 9