我希望创建一个函数,返回给定文本的前 5 个最常见单词长度的列表,并且我正在尝试专门学习和试验 defaultdict 和 Counter。
到目前为止,我的代码如下:
from collections import defaultdict as dd, Counter
def word_lengths(text):
my_dict = dd(int)
for word in text.split():
word = len(word)
my_dict[word]+=1
return my_dict
def top5(text):
my_dict = word_lengths(text)
my_list = sorted(my_dict, key=my_dict.get, reverse=True)[:5]
return my_list
到目前为止,我可以说这在很大程度上是有效的,但是我希望我的最终结果是绝对下降的,即如果一个 6 个字母和一个 7 个字母的单词同样有可能,我希望列出 7在我的前 5 名列表中的 6 之前。
所以,对于“敏捷的棕色狐狸跳过一只懒狗”,我希望它的结果是 [3, 5, 4, 6, 1]。
但是对于“一一是赛马二二也是一”,它应该显示 [3, 9, 1].
使用 defaultdict 和 Counter 看起来你走在正确的轨道上。但是,您当前的实施存在一个小问题。在对字长进行排序时,您只考虑频率而不是字长本身。要获得所需的输出,您可以稍微修改排序功能以同时考虑频率和字长。
修改后的代码:
from collections import defaultdict as dd, Counter
def word_lengths(text):
my_dict = dd(int)
for word in text.split():
word = len(word)
my_dict[word] += 1
return my_dict
def top5(text):
my_dict = word_lengths(text)
# Modify the sorting function to consider both frequency and word length
my_list = sorted(my_dict, key=lambda x: (my_dict[x], x), reverse=True)[:5]
return my_list
# Test cases
text1 = "the quick brown fox jumped over a lazy dog"
print(top5(text1)) # Expected output: [3, 5, 4, 6, 1]
text2 = "one one was a racehorse two two was one too"
print(top5(text2)) # Expected output: [3, 9, 1]
通过此修改,排序函数首先根据词长对词长进行排序,如果出现平局,则根据词长进行排序。这样,在相同频率的情况下,您可以获得所需的输出,其中较高的字长优先于较低的字长。
您的其余代码结构良好且易于理解,您对
defaultdict
和 Counter
的使用适合此任务。干得好!