【问题标题】:Sort a list based on dictionary values in python?根据python中的字典值对列表进行排序?
【发布时间】:2023-03-26 08:20:01
【问题描述】:

假设我有一本字典,然后我有一个包含字典键的列表。有没有办法根据字典值对列表进行排序?

我一直在尝试这个:

trial_dict = {'*':4, '-':2, '+':3, '/':5}
trial_list = ['-','-','+','/','+','-','*']

我去用了:

sorted(trial_list, key=trial_dict.values())

得到:

TypeError: 'list' object is not callable

然后我去创建一个可以用trial_dict.get()调用的函数:

def sort_help(x):
    if isinstance(x, dict):
        for i in x:
            return x[i]

sorted(trial_list, key=trial_dict.get(sort_help(trial_dict)))

我不认为sort_help 函数对排序有任何影响。我也不确定使用 trial_dict.get() 是否是解决此问题的正确方法。

【问题讨论】:

    标签: python list sorting dictionary


    【解决方案1】:

    是的dict.get 是正确的(或者至少是最简单的)方式:

    sorted(trial_list, key=trial_dict.get)
    

    正如 Mark Amery 所评论的,等效的显式 lambda:

    sorted(trial_list, key=lambda x: trial_dict[x])
    

    可能会更好,至少有两个原因:

    1. 排序表达式可见且可立即编辑
    2. 它不会抑制错误(当列表包含不在字典中的内容时)。

    【讨论】:

    • 喂,不要再跳入我正在回答的问题并给出更聪明的答案了! :) 更严重的是:thg 的回答和我的回答有一个不同之处。如果 trial_values 包含一个不是 trial_dict 键的值,我的会引发异常,而 thg 会默默地将该值排序到前面。根据上下文,两者都可能合适。
    • @thg435 我应该仔细检查文档,我显然误解了.get
    • @MarkAmery:说真的,是的,lambda 给了你更多的控制权,在大多数情况下,这是应该使用的。
    • :) 也很严肃:您认为我们的哪种方法在风格上更好?即使在这种情况下,出于风格原因,我也喜欢 lambda,因为这意味着您可以看到正在排序的 表达式(即,trial_dict[x])而无需做任何进一步的操作想法;根据您的回答,我需要可视化被调用的函数以查看我们正在对 trial_dict.get(x) 进行排序,这需要额外的认知步骤。所以我认为我更喜欢我的方法而不是你的方法。怎么想?
    【解决方案2】:

    sorted 内置函数(或列表的sort 方法)中的关键参数必须是将要排序的列表成员映射到要排序的值的函数。所以你想要这个:

    sorted(trial_list, key=lambda x: trial_dict[x])
    

    【讨论】:

    • 对于像这样的较小函数,我应该牢记 lambda。我将 thg435 标记为已回答,但这对我很有帮助,我必须考虑使用 lambda 以备将来使用,谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2014-07-13
    相关资源
    最近更新 更多