python - 一种将连续二进制位加倍的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 代码中实现这一点?
解决方案
怎么样?
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]
推荐阅读
- android - 分页 Recyclerview 的增量页面索引
- python - 不完整的python代码没有执行
- rest - 如何使用 Outlook rest api v1.0 发送多个“致收件人”的电子邮件
- vba - Excel 单元格值根据其他单元格值更改
- java - 包含 onTouchListener 时,OnclickListener 不起作用
- sql - 如何在数据库二叉树中找到没有根的节点
- php - sql和数据库连接问题?
- php - 从 4 输入表单为 MySQL 插入和更新创建循环
- javafx - 将 java fx 代码转换为 java scenebuilder
- css - 我如何正确使用引导程序混合进行框阴影和过渡?