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

0 python string binary

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

use*_*203 6

您可以使用正则表达式。

\n\n

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

\n\n
import re\n\ns = \'01000110\' \nprint(len(re.findall(r\'(0+|1+)\', s)))    # [\'0\', \'1\', \'000\', \'11\', \'0\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
5\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如 @John Coleman 指出的,您还可以使用 itertools,它在大型二进制字符串上会稍微快一些:

\n\n
len(list(itertools.groupby(s)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

时间:

\n\n
In [18]: x = np.random.randint(2, size=100000)\n\nIn [19]: x = \'\'.join(map(str, x))\n\nIn [20]: %timeit len(re.findall(r\'(0+|1+)\', x))\n10.9 ms \xc2\xb1 327 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nIn [21]: %timeit len(list(itertools.groupby(x)))\n9.42 ms \xc2\xb1 173 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nIn [22]: %timeit sum(1 for i in itertools.groupby(x))\n9.12 ms \xc2\xb1 156 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n