2012-10-29 58 views
2

我需要從用戶接收一個字符串,將它顯示在列表中,以便列表中的每個器官包含[字母,它在一行中重複的數字]。列表和計數重複字母

我以爲我的代碼是好的,但它不起作用。

這裏是我的代碼:

my_str = raw_input("Enter a string:") 

j=0 
while j<=len(my_str): 
    for i in my_str: 
     counter=0 
     if i==i+1: 
      counter +=1 
      continue 
      print i, counter 

     else: 
      print i,1 
      j+=1 

輸出:

Enter a string: baaaaab 
As list: [['b', 1], ['a', 5], ['b', 1]]

回答

3

這是你的代碼截然不同的,但這樣做的更有效的方法是使用itertools.groupby

import itertools 
my_str = raw_input("Enter a string:") 
print [[g[0], sum(1 for _ in g[1])] for g in itertools.groupby(my_str)] 
+0

我們沒有學過它,但我更喜歡使用我們所做的事情。 – user1562379

+4

正如你應該的。 :)這個答案更適合那些可能會遇到問題的人。 – Amber

+0

我不會實現列表,而是使用'sum(1 for _ in g [1])' –

1

提示:在這裏,i + 1不是你的意思。 Python解釋器告訴你什麼是問題。

提示:在這裏,在您的代碼中,print i,counter行永遠不會執行。

+0

看看導致該行的條件。它有可能嗎? – DaveTheScientist

+0

我想要檢查當前器官是否爲下一個器官。 我剛剛沒有成功 – user1562379

+0

,但'i'包含一個字母,'i + 1'不是下一個字母,它試圖給你的字母加1,因此python告訴你'TypeError:不能連接'str'和'int'objects'這意味着它不能在字母和整數上使用'+'操作。 –

-2

下面的代碼與您的實現類似,但使用set。

s = 'abcdeff' 
set((i, s.count(i)) for i in s) 

輸出:

set([('a', 1), ('b', 1), ('c', 1), ('d', 1), ('e', 1), ('f', 2)]) 
+1

這不會爲'aba'產生所需的輸出。此外,如果他們只是想要字符串中的項目的原始計數,那麼使用'collections.Counter'會比重複字母重複計數更有效率。 – Amber

+0

aba確實提供了正確的解決方案,我提供解決方案的目的是幫助該人員與他自己的代碼相關聯。 –

0

至於建議的Amber你需要的是已經被反dicionary的collections模塊中提供。

from collections import Counter 
my_str = raw_input("Enter a string:") 
count = Counter(my_str) 
print count.items() 

唯一的限制是它甚至會計算特殊字符。如果你想只計算標準的字母,您可以參照string模塊獲得的字母列表廣告只保留一個你有興趣到:

from collections import Counter 
from string import ascii_letters 
my_str = raw_input("Enter a string:") 
count = Counter(s for s in my_str if s in ascii_letters) 
print count.items() 
+0

這是我最喜歡的解決方案。 –

+1

他在問如何在字符串中找到_consecutive_字符。他的例子非常清楚:給定一個像'baaaaab'這樣的字符串正在等待'[['b',1],['a',5],['b',1]]'的輸出。你的解決方案給出'[('a',5),('b',2)]'。 –