有没有办法用 Python 对字典值进行排序

问题描述 投票:0回答:1

我希望创建一个函数,返回给定文本的前 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].

python dictionary sorting counter defaultdict
1个回答
0
投票

使用 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
的使用适合此任务。干得好!

© www.soinside.com 2019 - 2024. All rights reserved.