Подсчет количеств значений в каждой последовательности

Мне нужно посчитать сколько в данном списке раз встречаеться True

a = [True, False, False, True, True, False]

Вывод должен быть в формате [1,2] в смысле что если 1 true то 1, если 2 true подряд то 2. В голову пришла вот такая несложная идея решения:

li = []
count = 0
i = 0
while a[i] < len(a):
    if a[i] == True:
            count += 1
    if a[i] != True and count != 0:
            li.append(count)
            count = 0
    i += 1

print(li)

Но и это не получается совершить. В список перменная count почему-то заноситься не хочет, да и IndexError выкидывает, даже если поставить len(a) - 1


Ответы (4 шт):

Автор решения: Владимир Клыков

Если я верно понял задачу то как то так:

a = [True, False, False, True, True, False,False,False]
li = []
count = 0
i = 0
old = a[0]
while i < len(a):
    if a[i] == old:
        count += 1
    else:
        li.append(count)
        count = 1
        old = a[i]
    i += 1
li.append(count)    
print(li)

Вывод:

[1,2,2,3]
→ Ссылка
Автор решения: Dmitry

Проще, надо чуть проще. Первое, по возможности не работайте с длиной списка, всегда есть возможность уйти за пределы. Поскольку вы все равно бежите по всему списку, так и итерируйтесь прямо по нему. Второе, не добавляйте лишних условий. Плохо читается и думается

a = [True, False, False, True, True, False]

count = 0
result = []

for i in a:
    if i:
        count += 1
    elif count != 0:
        result.append(count)
        count = 0

if count:
    result.append(count)

в каждой итерации вы будете брать i из списка по порядку, которое будет равно True/False. Поэтому можно использовать if i: поскольку это будет эквивалентно if True и тогда ветка сработает, либо if False и тогда в эту ветку не пойдет

→ Ссылка
Автор решения: Stanislav Volodarskiy

itertools.groupby:

import itertools

a = [True, False, False, True, True, False]
groups = [sum(1 for _ in g) for k, g in itertools.groupby(a) if k]
print(groups)

[1, 2]

Если вы хотите решить задачу "руками", то надо рассмотреть все возможные сочетания пар соседних значений и обработать нужные:

a = [True, False, False, True, True, False]
result = []
prev = False
for v in a:
    if prev and v:
        # ..., True, True, ...
        result[-1] += 1
    if not prev and v:
        # ..., False, True, ...
        result.append(1)
    prev = v
print(result)

[1, 2]

Код можно упростить так...

result = []
prev = False
for v in a:
    if v:
        if prev:
            # ..., True, True, ...
            result[-1] += 1
        else:
            # ..., False, True, ...
            result.append(1)
    prev = v

... или так ...

result = []
prev = False
for v in a:
    if v:
        if not prev:
            result.append(0)
        result[-1] += 1
    prev = v

В последнем случае код стал короче, но объяснить его сложнее.

→ Ссылка
Автор решения: Пушистик
a = [True, False, False, True, True, False]

li = []
count = 0
for i in a:
    if i:
        count += 1
    elif count != 0:
        li.append(count)
        count = 0
if count:
    li.append(count)

print(li)

→ Ссылка