2014-05-11 174 views
0
def wordtally(): 
    test1 = "One day, Jimmy Jimmy Jimmy." 
    no_punct = test1.strip(".") 
    split = no_punct.split() 
    subscript = 0 
    D = {} 
    split = no_punct.split() 
    for n in split: 
     if n in D.keys(): 
      D[n] += 1 
     else: 
      D[n] = 1 
    return max(D.values()) 

我的代碼現在返回最大值,這是三個,但我希望它返回該值出現的鍵。當我嘗試使用按鍵功能時,出現一個錯誤,表示它沒有任何參數。有沒有辦法呢?使用字典值和鍵

+0

你應該改變你的條件,以'如果n在d:'因爲此刻你正在生成的科列表然後檢查那個是「O(N)」操作的列表。 D'中的n是'O(1)'。 – Midnighter

回答

1

你的函數的最後一行修改此:

return max(D.keys(), key=D.get) # or just D instead of D.keys() 

它將返回Jimmy

max函數將調用getdict方法爲D中的每個鍵獲取相應的值,然後返回該鍵的最大找到值。


我希望您瞭解collections.Counter。它可以縮短你的函數:

from collections import Counter 

def wordtally(): 
    test1 = "One day, Jimmy Jimmy Jimmy." 
    no_punct = test1.strip(".") 
    return Counter(no_punct.split()).most_common()[0][0] 

print(wordtally()) # Jimmy 
+0

你能解釋一下嗎? –

+0

@OutlawLemur更新了簡化的代碼和解釋 – vaultah

0

也許你的問題得到最常見的元素列表中的一個簡單的方法:

def find_most_common(inStr,inSeperator): 
    alist = inStr.strip(inSeperator).split() 
    return max(set(alist), key=alist.count) 

print find_most_commmon("One day, Jimmy Jimmy Jimmy.",".") 
0

除非這是一個鍛鍊,它會更容易使用collections.Counter做計數和re.findall做的話基本斷詞:

from collections import Counter 
import re 

text = 'One day, Jimmy Jimmy Jimmy.' 
words = re.findall('\w+', text) 
# ['One', 'day', 'Jimmy', 'Jimmy', 'Jimmy'] 
word_counts = Counter(words) 
# Counter({'Jimmy': 3, 'day': 1, 'One': 1}) 
most_common, = word_counts.most_common(1) 
# ('Jimmy', 3) 
print most_common[0] 
# Jimmy