2013-09-06 14 views
10

Mam ciąg znaków, który wygląda tak:Liczenie przebiega ciąg

string = 'TTHHTHHTHHHHTTHHHTTT' 

jaki sposób mogę policzyć liczbę przejazdów w ciągu tak, że dostaję,

5 serii T i 4 biegnie H

Odpowiedz

20

można użyć kombinacji itertools.groupby i 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 grupuje artykuł w oparciu o klucz. (Domyślnie jest kluczem jest pozycje iterowalny sobie)

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

Oto pierwszy element jest kluczem (k) na podstawie którego produkty zostały pogrupowane i list(g) to grupa powiązanych do tego klucza. Ponieważ interesuje nas tylko część key, możemy przekazać k do collections.Counter, aby uzyskać pożądaną odpowiedź.

+1

wielki, nigdy nie wiedział, że pyton GroupBy prace różnią się od jednego SQL, dzięki +1. Szkoda, że ​​nie mam czasu pracować z pytonem w pracy :( –

2

Dla odmiany, re -na podejście

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)] 
Powiązane problemy