2016-11-29 50 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)]