在字符串中计算连续出现的次数

11

我有一个字符串,看起来像这样:

string = 'TTHHTHHTHHHHTTHHHTTT'

我该如何计算字符串中的运行次数,以便得到:

5个T的运行和4个H的运行

2个回答

21
你可以使用 itertools.groupbycollections.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来获取所需的答案。


1
太棒了,我从来不知道Python的groupby和SQL的不同之处,谢谢,+1。可惜我在工作中没有时间使用Python :( - Roman Pekar

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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接