mercredi 20 avril 2016

Find top 5 word lengths in a text

I'm trying to write a program that takes two functions:

  1. count_word_lengths which takes the argument text, a string of text, and returns a default dictionary that records the count for each word length. An example call to this function:

  2. top5_lengths which takes the same argument text and returns a list of the top 5 word lengths.

Note: that in the event that two lengths have the same frequency, they should be sorted in descending order. Also, if there are fewer than 5 word lengths it should return a shorter list of the sorted word lengths.

Example calls to 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})

Example calls to 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]

My current code is this, and seems to output all these calls, however it is failing a hidden test. What type of input am I not considering? Is my code actually behaving correctly? If not, how could I fix this?

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_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

Aucun commentaire:

Enregistrer un commentaire