2012-11-02 43 views
6

Tôi cần viết mã để cắt chuỗi (là đầu vào), thêm vào một danh sách, đếm số của mỗi chữ cái - và nếu nó giống với chữ cái trước đó, không đặt nó trong danh sách, nhưng thay vì tăng số lượng xuất hiện của lá thư trong một trước .. Vâng đây là cách nó sẽ giống như thế:Đếm ký tự liên tiếp trong một chuỗi

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

từ sát thủ chỉ là một ví dụ về cần .. Mã của tôi cho đến thời điểm này như sau:

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 

Cảm ơn!

Trả lời

18

Sử dụng Collections.Counter(), từ điển là một cách tốt hơn để lưu trữ này:

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

hoặc sử dụng itertools.groupby():

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

này doesn' t giữ trật tự của Bức thư. –

+0

@SilentGhost: Vì đó là câu hỏi. Câu trả lời không khớp với ví dụ được đưa ra bởi người hỏi câu hỏi. –

+1

@SilentGhost "Vâng, đây là hình thức của nó: sát thủ [['a', 1], ['s', 2], ['a', 1], ['s', 2]], ['i', 1], ['n', 1] " – mgilson

0

Chỉ sử dụng dựng sẵn:

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)] 
Các vấn đề liên quan