遍历一个布尔值列表以创建一个新的整数列表



我想把这个布尔值列表:

bool_list: [False, False, True, False, False, True, False, True, True, False]

进入整型列表:

int_li = [0, 0, 1, 1, 1, 2, 2, 3, 4, 4]

基本上,遍历布尔值列表,每次值为True时加1。有什么有效的方法吗?

如果您有Python 3.8或更高版本,您可以使用walrus操作符来使用列表推导生成所需的结果,利用以下事实:在整数上下文中,True == 1False == 0:

v = 0
int_li = [v := v+b for b in bool_list]

输出:

[0, 0, 1, 1, 1, 2, 2, 3, 4, 4]

创建一个变量(例如,count的值为0),循环遍历列表中的每个项目,每次它是True时,给count加1。然后将count添加到新列表中,如下所示:

bool_list = [False, False, True, False, False, True, False, True, True, False]
int_li = []
count = 0
for item in bool_list:
if item:
count += 1
int_li.append(count)
print(int_li)
# [0, 0, 1, 1, 1, 2, 2, 3, 4, 4]
from itertools import accumulate
int_li = list(map(int, accumulate(bool_list)))

正如Daniel Hao指出的那样,纯粹的accumulate不起作用,因为第一个元素将保持bool,从而产生[False, 0, 1, 1, 1, 2, 2, 3, 4, 4]。映射到int是我看到的最简单的修复,尽管我不太喜欢它。

另一种方式,初始值为0,然后忽略:

from itertools import accumulate
_, *int_li = accumulate(bool_list, initial=0)

只需在一行中执行列表推导式:

bool_list = [False, False, True, False, False, True, False, True, True, False]
int_list = [sum(bool_list[:i+1]) for i in range(len(bool_list))]

输出:

[0, 0, 1, 1, 1, 2, 2, 3, 4, 4]

最新更新