按python字典列表中的值之和排序

按python字典列表中的值之和排序,python,dictionary,list-comprehension,Python,Dictionary,List Comprehension,我有一本这样的字典: d = {'a':[{'a1':1},{'a2':5},{'a3':4}], 'b':[{'b1':0},{'b2':1},{'b3':2}], 'c':[{'c1':1},{'c2':2}]} 我想根据每个列表中的值之和(字典中每个项目的值)对其进行排序,以便得出: r = [('a', (10, [{'a1':1},{'a2':5},{'a3':4}])), ('b', (3, [{'b1':0},{'b2':1},{'b3':2}])),# 'b' and 'c'

我有一本这样的字典:

d = {'a':[{'a1':1},{'a2':5},{'a3':4}], 'b':[{'b1':0},{'b2':1},{'b3':2}], 'c':[{'c1':1},{'c2':2}]}
我想根据每个
列表中的值之和(字典中每个项目的值)对其进行排序,以便得出:

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}]))]
我可以用一种天真的方法来完成这件事。我想知道如何以一种更为通灵的方式来实现这一点。我已经试过了,但由于明显的原因无效:

sorted(sum(d.values()), key=d.get, reverse=True)
提前感谢您的回答

您可以尝试以下方法:

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}]))]

示例结果的语法无效,因为括号不匹配。固定括号会给出一个包含一个元素(字典)的列表,这是毫无意义的。请再试试你想要的输出。另外,除非您使用的是正确版本的Python,否则字典没有顺序的概念,因此无法排序。
d
中的内部字典是否总是只有一个键/值?如果是这样的话,那么让它们成对(元组)或者让一个dict列表更有意义。@AlexHall,谢谢你指出括号不匹配以及字典中没有固有顺序的事实。:)在我的问题中修复了它们。请使用比a、b、i和x更好的变量名。@Ajax1234谢谢您的有效解决方案!:)我有一个关于代码最后一行的后续问题:
key=lambda x:x[-1][0]
do是什么?谢谢。@user1330974
lambda x:x[-1][0]
是排序键。即排序比较中使用的值。@Ajax1234我想我现在明白了!:)
new_d.items()
返回类型为
dict_items
的iterable,其中
dict_items
中的每个项都由
lambda x:x[-1][0]
进行排序
x[-1]
检索列表中最后一个元素的方法。这意味着它返回
中的最后一个内部元组(例如,
(10,[{'a1':1},{'a2':5},{'a3':4}])
('a',(10,[{'a1':1},{'a2':5},{'a3':4}])
)和
x[-1][/code>返回
和的值。我们用它来分类。:)非常感谢你的帮助!