2012-11-02 100 views
6

我需要编写切片字符串(这是一个输入),它附加到一个列表中,计数每个字母的数目的码 - 如果它是相同的信之前,不要把它在列表中,而是在增加前一个字母的出现次数.. 嗯,这是应该的样子:计数连续字符在字符串

assassin [['a', 1], ['s', 2], ['a', 1], ['s', 2]], ['i', 1], ['n', 1] 

字刺客只是其中一个例子需要.. 我的代码到目前为止是这样的:

userin = raw_input("Please enter a string :") 
inputlist = [] 
inputlist.append(userin) 
biglist = [] 
i=0 
count = {} 
while i<(len(userin)): 
    slicer = inputlist[0][i] 
    for s in userin: 
     if count.has_key(s): 
      count[s] += 1 
     else: 
      count[s] = 1 
    biglist.append([slicer,s]) 
    i = i+1 
print biglist 

谢谢!

回答

18

使用Collections.Counter(),字典是存储这更好的办法:使用itertools.groupby()

>>> from collections import Counter 
>>> strs="assassin" 
>>> Counter(strs) 
Counter({'s': 4, 'a': 2, 'i': 1, 'n': 1}) 

或:

>>> [[k, len(list(g))] for k, g in groupby(strs)] 
[['a', 1], ['s', 2], ['a', 1], ['s', 2], ['i', 1], ['n', 1]] 
+1

这没有按”保存的顺序这些信。 –

+0

@SilentGhost:因为这就是问题所在。答案与问题提供者给出的例子不符。 –

+1

@SilentGhost“嗯,这是应该的样子: 刺客[ '一',1],[ 'S',2],[ '一',1],[ 'S',2], [ 'I',1],[ 'N',1]” – mgilson

0

仅使用内建的:

def cnt(s): 
    current = [s[0],1] 
    out = [current] 
    for c in s[1:]: 
     if c == current[0]: 
      current[1] += 1 
     else: 
      current = [c, 1] 
      out.append(current) 
    return out 

print cnt('assassin') 
1
last = '' 
results = [] 
word = 'assassin' 
for letter in word: 
if letter == last: 
    results[-1] = (letter, results[-1][1] +1) 
else: 
    results.append((letter, 1)) 
    last = letter 

print result # [('a', 1), ('s', 2), ('a', 1), ('s', 2), ('i', 1), ('n', 1)]