Подсчет количеств значений в каждой последовательности
Мне нужно посчитать сколько в данном списке раз встречаеться 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]
Проще, надо чуть проще. Первое, по возможности не работайте с длиной списка, всегда есть возможность уйти за пределы. Поскольку вы все равно бежите по всему списку, так и итерируйтесь прямо по нему. Второе, не добавляйте лишних условий. Плохо читается и думается
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 и тогда в эту ветку не пойдет
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)