Как сгруппировать элементы списка в группы различной длины последовательности? - PullRequest
0 голосов
/ 29 января 2020

У меня есть следующий список:

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

Я бы хотел собрать длину каждой Истинной и Ложной последовательности в сегменты. Мне нужно сосчитать все последовательности, которые имеют значение True, с последовательной длиной = 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})

1 Ответ

0 голосов
/ 30 января 2020

Это может быть через itertools.groupby и Counter:

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.

...