繁体   English   中英

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

[英]Iterate through a list of booleans in order to create a new list of integers

我想打开这个布尔列表:

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时,将 +1 添加到count 。然后将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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM