问题描述
我有一个二进制列表作为输入,这是一个示例:- [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]