尝试计算分组列表中的出现次数
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 来创建组,其值我 sum
med.
我正在计算一个列表中 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 来创建组,其值我 sum
med.