Подсчет последовательных дубликатов строк из списка

У меня есть список строк Python, такой что

Вход:

li = ['aaa','bbb','aaa','abb','abb','bbb','bbb','bbb','aaa','aaa']

Что я могу сделать, чтобы сгенерировать другой список, подсчитывающий количество последовательных повторений любой строки в списке? Для приведенного выше списка список возврата выглядит следующим образом:

Ожидаемый результат:

li_count = [['aaa',1],['bbb',1]['abb',2],['bbb',3],['aaa',2]]

person swopnilnep    schedule 13.06.2018    source источник
comment
Вы не забыли второе, не дублирующееся «ааа»? li_count = [['aaa',1],['bbb',1],['aaa',1],['abb',2],['bbb',3],['aaa,2]] должно быть правильно. И, пожалуйста, покажите, как выглядят ваши попытки до сих пор и почему они не работают.   -  person SpghttCd    schedule 13.06.2018


Ответы (1)


Используйте itertools.groupby:

from itertools import groupby
li = ['aaa','bbb','aaa','abb','abb','bbb','bbb','bbb','aaa','aaa']

a = [[i, sum(1 for i in group)] for i, group in groupby(li)]
print(a)
[['aaa', 1], ['bbb', 1], ['aaa', 1], ['abb', 2], ['bbb', 3], ['aaa', 2]]

Спасибо @ user3483203 за улучшение:

a = [[i, len([*group])] for i, group in groupby(li)]
person jezrael    schedule 13.06.2018
comment
Здесь намного быстрее использовать [[i, len([*group])] for i, group in groupby(li)]. Примерно в два раза быстрее, чем sum - person user3483203; 13.06.2018