首页 > 解决方案 > 一种将连续二进制位加倍的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(一个数的总和)

示例 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 总计 = 1 + 2 + 4 + 8 = 15,0 总计 = 0

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

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

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

标签: pythonpython-3.xbit-manipulationbitwise-operators

解决方案


怎么样?

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]

推荐阅读