【问题标题】:Sort by sum of values in a list for dictionary python按字典python列表中的值总和排序
【发布时间】:2026-02-19 05:10:01
【问题描述】:

我有一本这样的字典:

d = {'a':[{'a1':1},{'a2':5},{'a3':4}], 'b':[{'b1':0},{'b2':1},{'b3':2}], 'c':[{'c1':1},{'c2':2}]}

我想按每个 list 中的值总和(字典中每个项目的值)对其进行排序,以便得到:

r = [('a', (10, [{'a1':1},{'a2':5},{'a3':4}])),
('b', (3, [{'b1':0},{'b2':1},{'b3':2}])),# 'b' and 'c' have sum of '3', so they tied here
('c', (3, [{'c1':1},{'c2':2}]))]

我可以用一种天真的方法来完成这项工作。我想知道如何以更 Pythonic 的方式完成此任务。我已经尝试过了,但由于明显的原因没有工作:

sorted(sum(d.values()), key=d.get, reverse=True)

提前感谢您的回答!

【问题讨论】:

  • 您的示例结果不是有效的语法,因为括号不匹配。固定括号会给出一个包含一个元素(字典)的列表,这是毫无意义的。请再试一次您想要的输出。此外,除非您使用正确版本的 Python,否则字典没有顺序的概念,因此无法排序。
  • d 中的内部字典是否总是只有一个键/值?如果是这样,将它们配对(元组)或将字典列表设为一个字典会更有意义。
  • @AlexHall,感谢您指出括号不匹配以及字典中没有固有顺序这一事实。 :) 在我的问题中修复了它们。

标签: python dictionary list-comprehension


【解决方案1】:

你可以试试这个:

d = {'a':[{'a1':1},{'a2':5},{'a3':4}], 'b':[{'b1':0},{'b2':1},{'b3':2}], 'c':[{'c1':1},{'c2':2}]}
new_d = {a:(sum(list(i.values())[0] for i in b), b) for a, b in d.items()}
final_result = sorted(new_d.items(), key=lambda x:x[-1][0], reverse=True)

输出:

('a', (10, [{'a1': 1}, {'a2': 5}, {'a3': 4}])), ('c', (3, [{'c1': 1}, {'c2': 2}])), ('b', (3, [{'b1': 0}, {'b2': 1}, {'b3': 2}]))]

【讨论】:

  • 请使用比 a、b、i 和 x 更好的变量名。
  • @Ajax1234 感谢您提供有效的解决方案! :) 我有一个关于代码最后一行的后续问题:key=lambda x:x[-1][0] 是做什么的?谢谢。
  • @user1330974 lambda x:x[-1][0] 是排序键。即排序比较中使用的值。
  • @Ajax1234 我想我现在明白了! :) new_d.items() 返回dict_items 类型的可迭代对象,其中dict_items 中的每一个都由lambda x:x[-1][0] 处理以进行排序。 x[-1] 一种检索列表中最后一个元素的方法。这意味着它返回最后一个内部元组(例如,('a', (10, [{'a1': 1}, {'a2': 5}, {'a3': 4}])) 中的 (10, [{'a1': 1}, {'a2': 5}, {'a3': 4}]))并且x[-1][0] 返回sum 的值。我们用它来排序。 :) 非常感谢您的帮助!