2013-09-06 24 views
10

bir dize çalışırSayma ben şöyle bir dize var

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

0123: H

ait

cevap

20

Sen itertools.groupby ve collections.Counter bir arada kullanabilirsiniz Bir anahtar dayalıgrupları öğe.

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

Burada ilk öğe öğeleri gruplandırıldı ve list(g) ilgili grup olduğu dayanan tuşu (k) 'dir (öntanımlı anahtar tarafından iterable kendi içinde ürün olduğunu) bu tuşa. Sadece key bölümüyle ilgilendiğimiz için,'u collections.Counter'a istediğiniz cevabı almak için geçirebiliriz. Çeşitli için

+1

harika bir, piton GroupBy SQL biri, teşekkür, 1 den farklı çalıştığını bilmiyordum. Yazık ki iş yerinde python ile çalışmak için zamanım yok :( –

2

, bir re merkezli yaklaşım

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