首页 > 解决方案 > 如何将列表项分组到不同序列长度的桶中?

问题描述

我有以下列表:

l = [False, True, True, False, True, False, False, True, False, False, False, True]

我想将每个 True 和 False 序列的长度累积到存储桶中。我需要计算所有序列长度为真的序列= 1,然后序列长度= 2,序列长度= 3 ...

该列表的输出可能类似于:

错误: 正确{1:2, 2:1, 3:1}
{1:3, 2:1}

有人可以帮忙吗?

编辑:解决方案

from collections import defaultdict
trues = defaultdict(int)
l = [1 if i == True else -1 for i in l]
seq = []
for i in series:
    if i > 0:
        seq.append(i)
    else:
        if len(seq) != 0:
            trues[len(seq)] += 1
        seq = []
if len(seq) != 0:
    trues[len(seq)] += 1
print(trues)
>defaultdict(<class 'int'>, {2: 1, 1: 3})

标签: pythonlistsequencebucket

解决方案


这可以通过itertools.groupbyCounter

l = [False, True, True, False, True, False, False, True, False, False, False, True]

from collections import Counter
import itertools

Counter(sum(1 for item in group) 
        for head, group in itertools.groupby(l) 
        if head == True) # => Counter({1: 3, 2: 1})

groupby构造相等项目的运行,然后将这些项目按其头项目过滤,并取其每个组生成器的长度,并将其赋予Counter.


推荐阅读