Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中计算二进制字符串中连续循环1/0的块数_Python_String_Binary - Fatal编程技术网

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

如何在Python中计算二进制字符串中连续循环1/0的块数,python,string,binary,Python,String,Binary,例如,我希望代码为输入“01000110”返回“5”,因为循环数字块是“0”、“1”、“000”、“11”、“0”。我想不出解决这个问题的办法。非常感谢所有帮助/评论。您可以使用正则表达式 将匹配任何连续区域为1或0,然后可以检查结果数组的长度 import re s = '01000110' print(len(re.findall(r'(0+|1+)', s))) # ['0', '1', '000', '11', '0'] 输出: 5 正如@John Coleman所指出的,

例如,我希望代码为输入“01000110”返回“5”,因为循环数字块是“0”、“1”、“000”、“11”、“0”。我想不出解决这个问题的办法。非常感谢所有帮助/评论。

您可以使用正则表达式

将匹配任何连续区域为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或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)

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

array = numpy.random.randint(0, 2, (l))
此代码给出了连续区域的数量(不是优化的,只是为了展示概念)

例如

array = [0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0]
区域数量为

count = 9

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

array = numpy.random.randint(0, 2, (l))
此代码给出了连续区域的数量(不是优化的,只是为了展示概念)

例如

array = [0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0]
区域数量为

count = 9

模块中的功能
groupby
提供了一种自然的解决方案:

>>> len(list(itertools.groupby('01000110')))
5

正如@chrisz所指出的,您可以通过将
len(list())
替换为
sum()

来稍微加快速度,模块中的函数
groupby
提供了一个自然的解决方案:

>>> len(list(itertools.groupby('01000110')))
5

正如@chrisz所指出的,你可以通过用
sum()
替换
len(list())
来稍微加快这个过程。可能的重复:可能的重复:我很惊讶时间如此接近。如果有的话,我会预测正则表达式方法会更快,因为您不能直接将len()应用于groupby对象+1作一个有趣的比较。@JohnColeman如果不创建列表,您的方法可以(非常)稍微快一点,因此类似于
sum(在itertools.groupby(x)中为i取1))
,这将消耗生成器,但由于只需要最终输出,因此可以工作。我很惊讶时间如此接近。如果有的话,我会预测正则表达式方法会更快,因为您不能直接将len()应用于groupby对象+1作一个有趣的比较。@JohnColeman如果不创建列表,您的方法可以(非常)稍微快一点,因此类似于
sum(itertools.groupby(x)中的i为1))
,这将消耗生成器,但由于只需要最终输出,因此可以工作。这似乎是一个自然的解决方案(+1)并演示如何在不导入模块的情况下执行此操作。我不知道它为什么会被否决。我也不知道,他不知道如何解决这个问题,所以这似乎是最直观和概念上最简单的方法。这似乎是一个自然的解决方案(+1),并展示了如何在不导入模块的情况下实现它。我不知道为什么会被否决。我也不知道,他不知道如何解决这个问题,所以这似乎是最直观、概念上最简单的方法