2016-04-21 14 views
0

我试图写一个程序,它有两个功能:文本查找前5个字长

  1. count_word_lengths这需要论证文本,文本字符串,并返回一个默认词典记录每个词长度的计数。一个例子调用此函数:

  2. top5_lengths这需要相同的参数文本并返回前5字长的列表。

注意:在 两种长度具有相同的频率的情况下,就应该按降序排列。另外,如果长度少于5个字符,它应该返回一个较短的排序字长度列表。

实例调用count_word_lengths

count_word_lengths("one one was a racehorse two two was one too"): 
    defaultdict(<class 'int'>, {1: 1, 3: 8, 9: 1}) 

实例调用top5_lengths

top5_lengths("one one was a racehorse two two was one too") 
    [3, 9, 1] 

top5_lengths("feather feather feather chicken feather") 
    [7] 

top5_lengths("the swift green fox jumped over a cool cat") 
    [3, 5, 4, 6, 1] 

我当前的代码是这样的,而且似乎输出所有这些电话,但它是失败的一个隐藏的测试。我没有考虑什么类型的输入?我的代码的行为是否正确?如果没有,我该如何解决这个问题?

from collections import defaultdict 

length_tally = defaultdict(int) 
final_list = [] 

def count_word_lengths(text): 
    words = text.split(' ') 

    for word in words: 
     length_tally[len(word)] += 1 

    return length_tally 


def top5_word_lengths(text): 
    frequencies = count_word_lengths(text) 
    list_of_frequencies = frequencies.items() 
    flipped = [(t[1], t[0]) for t in list_of_frequencies] 
    sorted_flipped = sorted(flipped) 
    reversed_sorted_flipped = sorted_flipped[::-1] 


    for item in reversed_sorted_flipped: 
     final_list.append(item[1]) 

    return final_list 

回答

0

我不是Python家伙,但我可以看到一些可能导致问题的事情。

  • 您继续参考top5_lengths,但您的代码有一个函数,称为top5_word_lengths
  • 您可以使用一个名为count_lengths的函数,该函数在任何地方都没有定义。

修复这些,看看会发生什么!

编辑: 这不应该影响您的代码,但它不是伟大实践,为您的函数来更新其范围之外的变量。您可能希望将顶部的变量赋值移至使用它们的函数。

1

有一点要注意的是,你不占空字符串。这会导致count()返回null/undefined。您也可以列表解析过程中使用iteritems()来得到一个字典的键和值像for k,v in dict.iteritems():

0

不是一个真正的答案,但跟踪的话,而不是仅仅的另一种方式长度:

from collections import defaultdict 

def count_words_by_length(text): 
    words = [(len(word),word) for word in text.split(" ")] 
    d = defaultdict(list) 
    for k, v in words: 
     d[k].append(v) 
    return d 


def top_words(dict, how_many): 
    return [{"word_length": length, "num_words": len(words)} for length, words in dict.items()[-how_many:]] 

使用如下:

my_dict = count_words_by_length('hello sir this is a beautiful day right') 
my_top_words = num_top_words_by_length(my_dict, 5) 

print(my_top_words) 
print(my_dict) 

输出:

[{'word_length': 9, 'num_words': 1}] 
defaultdict(<type 'list'>, {1: ['a'], 2: ['is'], 3: ['sir', 'day'], 4: ['this'], 5: ['hello', 'right'], 9: ['beautiful']})