Сортировка словаря по значению атрибута

#python #sorting

#python #сортировка

Вопрос:

У меня есть словарь списка, подобный этому: {1: {'a': 5, 'score': 3}, 2: {'a': 6, 'score': 1}, 3: {'a': 7, 'score': 2}} и я хочу отсортировать его, используя его score атрибут. Предполагаемый результат: {2: {'a': 6, 'score': 1}, 3: {'a': 7, 'score': 2}, 1: {'a': 5, 'score': 3}}

Я пытаюсь использовать встроенную функцию для сортировки списка, но она не дает желаемого результата updatedList = sorted(b, key=lambda k: k['score'])

Любые подсказки, как я могу получить желаемый результат?

Ответ №1:

Ваша структура данных представляет собой вложенный словарь, а не список.

Чтобы отсортировать словарь, вы можете изменить свою key функцию следующим образом:

 >>> d = {1: {'a': 5, 'score': 3}, 2: {'a': 6, 'score': 1}, 3: {'a': 7, 'score': 2}}
>>> dict(sorted(d.items(), key=lambda x: x[1]['score']))
{2: {'a': 6, 'score': 1}, 3: {'a': 7, 'score': 2}, 1: {'a': 5, 'score': 3}}
  

Который преобразует исходный словарь в dict.items , затем использует score ключ из словаря в (key, value) кортеже. Затем после сортировки с sorted() помощью мы можем преобразовать обратно в словарь с dict() помощью .

Это работает в Python 3.6 , поскольку словари упорядочены. Если вы используете более низкую версию python, вы можете поддерживать порядок вставки словаря с collections.OrderedDict помощью instead .

Ответ №2:

Для сортировки вложенного словаря используйте key аргумент for sorted() . Это позволяет вам указать функцию, которая, учитывая фактический сортируемый элемент, возвращает значение, по которому следует отсортировать.

 N_Dictionary = {1: {'a': 5, 'score': 3}, 2: {'a': 6, 'score': 1}, 3: {'a': 7, 'score': 2}}
s_values = sorted(N_Dictionary.items(), key = lambda x: x[1]["score"] )
s_values