在Python中基于字典值对列表进行排序?

20

假设我有一个字典,然后我有一个包含该字典键的列表。是否有一种方法可以根据字典的值对列表进行排序?

我一直在尝试这样做:

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()

2个回答

21

是的,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的答案将默默地将该值排序到前面。根据上下文,任何一种方法都可能是合适的。 - Mark Amery
@thg435 我应该再仔细检查文档,我显然误解了.get函数的作用。 - tijko
@MarkAmery:说真的,是的,Lambda 给你更多的控制权,在大多数情况下这也应该被使用。 - georg
1
:) 另外说一句认真的:你认为我们哪种方法在风格上更好?我喜欢使用lambda的风格原因,即使在这种情况下,因为它意味着你可以看到正在排序的表达式(也就是trial_dict[x]),而无需进行任何进一步的思考;而根据您的答案,我需要想象调用函数以查看我们是在对trial_dict.get(x)进行排序,这需要额外的认知步骤。因此,我认为我的方法比你的更好。你怎么看? - Mark Amery
@MarkAmery 我卡住的地方是.get没有明确说明。 - tijko

8

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

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

我应该记住在像这样的较小函数中使用lambda。我将thg435标记为已回答,但这真的很有帮助,我将来会考虑使用lambda,谢谢! :) - tijko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接