例如,我希望代码为输入“01000110”返回“5”,因为重复出现的数字块是“0”、“1”、“000”、“11”、“0”。我想不出解决这个问题的方法。感谢所有帮助/评论。
您可以使用正则表达式。
\n\n(0+|1+)将匹配任何连续区域为 1 或 0,然后您可以检查结果数组的长度。
import re\n\ns = \'01000110\' \nprint(len(re.findall(r\'(0+|1+)\', s))) # [\'0\', \'1\', \'000\', \'11\', \'0\']\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n5\nRun Code Online (Sandbox Code Playgroud)\n\n正如 @John Coleman 指出的,您还可以使用 itertools,它在大型二进制字符串上会稍微快一些:
\n\nlen(list(itertools.groupby(s)))\nRun Code Online (Sandbox Code Playgroud)\n\n时间:
\n\nIn [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)\nRun Code Online (Sandbox Code Playgroud)\n