如何在Python中计算二进制字符串中连续循环1/0的块数
例如,我希望代码为输入“01000110”返回“5”,因为循环数字块是“0”、“1”、“000”、“11”、“0”。我想不出解决这个问题的办法。非常感谢所有帮助/评论。您可以使用正则表达式 将匹配任何连续区域为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所指出的,
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),并展示了如何在不导入模块的情况下实现它。我不知道为什么会被否决。我也不知道,他不知道如何解决这个问题,所以这似乎是最直观、概念上最简单的方法