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

问题描述

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

我想编写一个创建两个乐谱的函数。分数为零,分数为零。

评分系统如下:如果两个相同的数字彼此相邻,则每次得分值翻倍。因此,如果两个彼此相邻,则其价值要大于它们被零分隔的价值。彼此相邻的两个将被赋值为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(总共1个)

示例2: 输入: [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 + 2 + 4 + 8 = 15个零总数= 0

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

所以输入是一个可变长度的一和零列表 输出是两个总数,一个零的总数,和一个零的总数。

想知道是否有一种花哨的短按位方法可以在最短的pythonic代码中实现这一目标?

解决方法

那怎么样?

from itertools import groupby
input_list =  [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]