2016-11-29 46 views
1
公共字
def words(word,number): 
    if number<len(word): 
     result={} 
     for key,value in word.items(): 
      common_num=sorted(set(word.values()), reverse=True)[:number] 
      if value in common_num: 
       result.update({key:value}) 
     word.clear() 
     word.update(result) 
     new_word_count={} 
     common_word=[] 
     common=[] 
     for key, value in word.items(): 
      if value in common_word: 
       common.append(value) 
      common_word.append(value) 
     new_word_count=dict(word) 
     for key,value in new_word_count.items(): 
      if value in common: 
       del word[key] 

實施例:計數在Python

>>> word={'a': 2, 'b': 2, 'c' : 3, 'd: 3, 'e': 4, 'f' : 4, 'g' : 5} 
>>> words(word,3) 

我的輸出:{ 'G':5}

預期輸出:{ 'G':5, 'E':4, 「F」:4}

知道爲什麼即時得到這個輸出

+0

我的程序應該採取5,4,4作爲最高的數字,但它採取5,4,3 – CAVS

+3

這是一個家庭作業,必須以某種方式解決?否則,我建議讓'collections.Counter'完成大部分工作。 – ShadowRanger

+0

@ShadowRanger是的,這是一個任務,我不能使用collections.Counter – CAVS

回答

3

好,沒有任何特殊的進口,有更容易的方式來完成你想要做什麼。在跟蹤和存儲所保存的值時,您會遇到很多棘手的問題,然後刪除,然後重新添加,這樣可以簡化很多工作;即使有解釋性意見,這是顯着縮短:

def common_words(word_count, number): 
    # Early out when no filtering needed 
    if number >= len(word_count): 
     return 

    # Get the top number+1 keys based on their values 
    top = sorted(word_count, key=word_count.get, reverse=True)[:number+1] 

    # We kept one more than we needed to figure out what the tie would be 
    tievalue = word_count[top.pop()] 

    # If there is a tie, we keep popping until the tied values are gone 
    while top and tievalue == word_count[top[-1]]: 
     top.pop() 

    # top is now the keys we should retain, easy to compute keys to delete 
    todelete = word_count.keys() - top 
    for key in todelete: 
     del word_count[key] 

有稍微好一點的方法來做到這一點,避免重複word_count查找(排序items,不keys,等等),但是這是比較容易理解IMO,並且word_count中的額外查找是有界的和線性的,所以這不是什麼大問題。

+0

Blech。在我回答之前,藍屏讓我失望了:對於這個問題你是對的(只要最高值出現數字+ 1次或更多時就會發生),但修正是微不足道的,只是改變'而tievalue == word_count [top [ -1]]:'to'while top和tievalue == word_count [top [-1]]:'。已在答案中更新。 – ShadowRanger

+0

我不會刪除答案,但這裏的基本邏輯非常簡單。如果你還沒有引入某些概念(例如'dict'視圖的類似set'的行爲),你需要用你可用的工具重新實現它們。或者你可以保留一些你已經使用的邏輯,用'top'來創建一個新的'dict',其中包含要保留的值,然後按照以前的方式'清除'和'更新''word_count'。相同的基本邏輯有很多變化;你可以也應該玩弄它,不僅僅是爲了欺騙那些尋求複製的分級人員,而是確保你明白髮生了什麼。 – ShadowRanger

+0

@CAVS:僅僅因爲你有一個答案,這個問題並不是好的形式。你的原始代碼在任何情況下都是錯誤的,所以你不需要擔心人們複製它並讓你陷入麻煩;一旦你修復它,它不應該是一個明確的重複。 – ShadowRanger

1

雖然作者提到避免Counter(),對於那些希望看到如何應用它的評論,這裏是由@ShadowRanger提出了簡短的解決方案:

import collections as ct 

word={'a': 2, 'b': 2, 'c' : 3, 'd': 3, 'e': 4, 'f' : 4, 'g' : 5} 
words = ct.Counter(word) 
words.most_common(3) 
# [('g', 5), ('f', 4), ('e', 4)]