2015-09-09 2 views
3

Например данной строкиРазделение строки на последовательные подсчеты?

"aaabbbbccdaeeee" 

Я хочу сказать, что-то вроде

3 a, 4 b, 2 c, 1 d, 1 a, 4 e 

Это достаточно легко сделать в Python с грубой петли силы, но мне интересно, если есть более Pythonic/более чистый однострочный тип подхода.

Моего перебор:

while source!="": 
     leading = source[0] 
     c=0 
     while source!="" and source[0]==leading: 
      c+=1 
      source=source[1:] 
     print c, leading 
+0

Что скотина петля силы вы придумали? Помните, если вы отредактируете вопрос, чтобы включить туда? – metatoaster

+0

@metatoaster Я не уверен, насколько это актуально, но я добавил свой метод к OP. – user268254

+0

Это должно показать вам, что это удалось, и мы также можем использовать это, чтобы опираться на ваше решение чего-то лучшего. – metatoaster

ответ

8

Используйте Counter для подсчета каждой отдельной буквы в строке, независимо от позиции:

>>> s="aaabbbbccdaeeee" 
>>> from collections import Counter 
>>> Counter(s) 
Counter({'a': 4, 'b': 4, 'e': 4, 'c': 2, 'd': 1}) 

Вы можете использовать groupby, если положение в строке имеет значение:

from itertools import groupby 
li=[] 
for k, l in groupby(s): 
    li.append((k, len(list(l)))) 

print li 

Отпечатки:

[('a', 3), ('b', 4), ('c', 2), ('d', 1), ('a', 1), ('e', 4)] 

Что может быть свести к списку понимания:

[(k,len(list(l))) for k, l in groupby(s)] 

Вы можете даже использовать регулярное выражение:

>>> [(m.group(0)[0], len(m.group(0))) for m in re.finditer(r'((\w)\2*)', s)] 
[('a', 3), ('b', 4), ('c', 2), ('d', 1), ('a', 1), ('e', 4)] 
Смежные вопросы