2015-05-24 74 views
2

所以我在寫作業問題時遇到了問題。字符串到字典字數

Write a function word_counter(input_str) which takes a string input_str and returns a dictionary mapping words in input_str to their occurrence counts.

所以我到目前爲止的代碼是:

def word_counter(input_str): 

'''function that counts occurrences of words in a string''' 

    sentence = input_str.lower().split() 

    counts = {} 

    for w in sentence: 
     counts[w] = counts.get(w, 0) + 1 

    items = counts.items() 
    sorted_items = sorted(items) 

    return sorted_items 

現在,當我運行一個測試案例的代碼,如在Python外殼word_counter("This is a sentence")我得到的結果是:

[('a', 1), ('is', 1), ('sentence', 1), ('this', 2)] 

這是需要的。然而,用來檢查答案的測試代碼:

word_count_dict = word_counter("This is a sentence") 
items = word_count_dict.items() 
sorted_items = sorted(items) 
print(sorted_items) 

當我與該代碼運行它,我得到的錯誤:

Traceback (most recent call last): 
File "<string>", line 2, in <fragment> 
builtins.AttributeError: 'list' object has no attribute 'items' 

不知道如何改變我的代碼,以便它與給定的測試代碼一起工作。

+2

'sorted'返回列表對象而不是字典對象。所以'word_counter'也返回一個列表對象,並且你正試圖調用'items',就像它在字典上調用它一樣。那就是問題所在。只要執行'print(word_counter(「這是一個句子」))'這已經足夠了 – thefourtheye

+0

你的函數沒有返回一個字典,而是一個元組列表,這是dict.items在Python 2中給你的。 – jwilner

+0

@thefourtheye I明白我在排序和項目位現在做了什麼問題,但是,你是什麼意思「只要打印(word_counter(」這是一個句子「))」是我唯一需要在函數中?對不起 – Mikey

回答

0

找出我做錯了什麼。只刪除最後2行代碼並返回計數字典。其他測試代碼:)

2

它看起來像你在原始代碼中發現錯誤,所以你可能都會照顧。

也就是說,您可以使用collections.Counter()來緊縮代碼。它在文檔中的示例與您的任務密切匹配:

>>> # Find the ten most common words in Hamlet 
>>> import re 
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower()) 
>>> Counter(words).most_common(10) 
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631), 
('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]