Сортировка по сумме значений в списке для словаря Python

1

У меня есть такой словарь:

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

Я могу сделать это с наивным подходом. Я хотел бы знать, как это сделать более питоническим способом. Я пробовал это, но не работал по понятной причине:

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

Заранее благодарю за ваши ответы!

Теги:
dictionary
list-comprehension

1 ответ

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}]))]
  • 3
    Пожалуйста, используйте лучшие имена переменных, чем a, b, i и x.
  • 0
    @ Ajax1234 Спасибо за рабочее решение! :) У меня есть дополнительный вопрос о последней строке кода: что делает key=lambda x:x[-1][0] ? Спасибо.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню