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