一种将连续二进制位加倍的 pythonic 方法

a pythonic way of doubling consecutive binary bits

我有一个二进制列表作为输入,这是一个例子:- [0, 1, 0, 0, 1, 1, 1, 0, 1, 0]

我想编写一个创建两个分数的函数。 0 分和 1 分。

计分系统如下:如果两个相同的数字相邻,每次得分翻倍。因此,如果有两个相邻的值比它们被零分隔时的值更高。两个相邻的将被评估为 3。三个相邻的将被评估为 7,依此类推。 [1, 1]

得分 1 2

总计 = 1 + 2 = 3

[1, 1 ,1]

得分 1 2 4

总计 = 1 + 2 + 4 = 7

例如上面的二进制查找列表 零的总值为 1 + 1 + 2 + 1 + 1 = 6(零总数)

个的总值为 1 + 1 + 2 + 4 + 1 = 9(个的总数)

示例 2: 输入: [0,0,0,1,1,0,1,1]

一个 索引 3 = 1,索引 4 = 2,索引 6 = 1,索引 7 = 2 总计 = 1+2+1+2 = 6

零点 索引 0 = 1,索引 1 = 2,索引 2 = 4,索引 5 = 1 零总计 = 1+2+4+1 = 8

示例 3: 输入:[1,1,1,1] 输出:总计 = 1 + 2 + 4 + 8 = 15,总计零 = 0

示例 4: 输入:[0,0,0,0,1] 输出:零总计 = 1 + 2 + 4 + 8 = 15,总计 = 1

因此输入是可变长度的 1 和 0 列表 输出是两个总计,一个是零的总和,一个是零的总和。

想知道是否有一种奇特的短按位方法可以在最短的 Pythonic 代码中实现这一点?

怎么样?

from itertools import groupby
input_list =  [0, 1, 0, 0, 1, 1, 1, 0, 1, 0]
results = [0, 0]  # First value is zeros, second is ones
for key, values in groupby(input_list):
    results[key] += (2**len(tuple(values))) - 1
assert results == [6,9]