Вы можете сделать это полностью с помощью itertools.groupby
:
Учитывая
import itertools as it
a = [True, True, True, False, False, False, False, True, True]
Код
[list(g)[0][0] for _, g in it.groupby(enumerate(a), key=lambda x: x[-1])]
# [0, 3, 7]
Подробности
Это вывод groupby
из вашей итерации:
[(k, list(g)) for k, g in it.groupby(a)]
# [(True, [True, True, True]),
# (False, [False, False, False, False]),
# (True, [True, True])]
Мы можем перечислить каждый элемент на группу (g
)как кортежи и группировка по последнему индексу в каждом кортеже:
[list(g) for k, g in it.groupby(enumerate(a), key=lambda x: x[-1])]
# [[(0, True), (1, True), (2, True)],
# [(3, False), (4, False), (5, False), (6, False)],
# [(7, True), (8, True)]]
Теперь мы хотим, чтобы первый элемент ([0]
) и первая позиция ([0]
) получили индекс каждой группы.
@ Предложение Chris_Rands о [next(g)[0] ...]
еще чище.
См. Также этот пост о том, как использовать groupby
.