我想把这个布尔值列表:
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 == 1
和False == 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]