尝试计算分组列表中的出现次数

Trying to calculate amount of occurrences in a list grouped

我正在计算一个列表中 1 出现的次数。

data = [0,4,5,2,-1,-2,5,1,5,3,5]

count = 0
count_list = []
new_count_list = []

for i in data:
    if i > 0:
        count_list.append(1)
    elif i <= 0:
        count_list.append(0)

for number in count_list:
    if number == 0:
        new_count_list.append(count)
        count = 0
    elif number == 1:
        count = count+1

print(count_list)
print(new_count_list)

出于某种原因,输出只显示:

[0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]
[0, 3, 0]

我猜你正试图在 count_list 中连续计算 1。你没有得到 [0,3,0,5] 的原因是因为如果你当前的数字是 0,你只会碰巧 new_count_list

因此不考虑最后一行 5 个 1,因为它不以 0 结尾。

您只需在循环结束时添加一个新测试。

另外,count_list不需要构建,直接测试是正数还是负数即可。

在您的代码中,在第二个 for 循环中,new_count_list 只有在 count_list 中看到零时才会更新。现在,由于 count_list 中有 3 个零,因此 new_count_list 中有 3 个条目。 count 的最终值没有更新到 new_count_list。因此,您只需要在第二个 for 循环之后将 count 的最终值附加到 new_count_list 即可获得所需的结果。 new_count_list.append(count) 在第二个 for 循环之后添加这个。然后输出将是 [0, 3, 0, 5]

您可以使用 itertools.groupby 为您进行分组,直接实现您想要的效果:

from itertools import groupby

data = [0,4,5,2,-1,-2,5,1,5,3,5]

lengths = [(len(list(group)), is_positive) for is_positive, group in groupby(data, key=lambda x: x>0)]

# [(1, False), (3, True), (2, False), (5, True)]

out = [length for length, is_positive in lengths if is_positive]
print(out)
# [3, 5]

分组的条件是值为正数。对于每个组,我们保留一个元组,其中包含组的长度和键,键告诉我们这是否是一组正值。

然后,我们只过滤正值组。

如果 1 是您 list 的最后一个元素,则 count 不是 .appended。我想要指出的是,我将利用某些 python 的功能以更少的代码行来完成此任务。即:

import itertools
data = [0,4,5,2,-1,-2,5,1,5,3,5]
data_1 = [1 if i>0 else 0 for i in data]
out = [sum(v) for k,v in itertools.groupby(data_1)]
print(out)

输出:

[0, 3, 0, 5]

说明:我使用列表理解和三元 if 然后 itertools.groupby 来创建组,其值我 summed.