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
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
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ź.
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)]
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 :( –