Счетные строки в строке

У меня есть строка, которая выглядит так:

string = 'TTHHTHHTHHHHTTHHHTTT'

Как я могу подсчитать количество прогонов в строке, чтобы получить,

5 пробегов T и 4 прогона H

Ответ 1

Вы можете использовать комбинацию itertools.groupby и collections.Counter:

>>> from itertools import groupby
>>> from collections import Counter
>>> strs = 'TTHHTHHTHHHHTTHHHTTT'
>>> Counter(k for k, g in groupby(strs))
Counter({'T': 5, 'H': 4})

itertools.groupby группирует элемент на основе ключа. (по умолчанию ключ - это элементы самого итерабельного)

>>> from pprint import pprint
>>> pprint([(k, list(g)) for k, g in groupby(strs)])
[('T', ['T', 'T']),
 ('H', ['H', 'H']),
 ('T', ['T']),
 ('H', ['H', 'H']),
 ('T', ['T']),
 ('H', ['H', 'H', 'H', 'H']),
 ('T', ['T', 'T']),
 ('H', ['H', 'H', 'H']),
 ('T', ['T', 'T', 'T'])]

Здесь первый элемент - это ключ (k), на основе которого элементы были сгруппированы, а list(g) - это группа, связанная с этим ключом. Поскольку нас интересует только часть key, поэтому мы можем передать k в collections.Counter, чтобы получить желаемый ответ.

Ответ 2

Для разнообразия подход re

import re
letters = ['H', 'T']
matches = re.findall(r'({})\1*'.format('|'.join(letters)), 'TTHHTHHZTHHHHTTHHHTTT')      
print matches
['T', 'H', 'T', 'H', 'T', 'H', 'T', 'H', 'T']
[(letter, matches.count(letter)) for letter in letters]
[('H', 4), ('T', 5)]