Сортировка словаря по значениям с использованием ключа сортировки, предоставляемого классом

#python-3.x #dictionary #lambda

#python-3.x #словарь #лямбда

Вопрос:

Я использую класс с несколькими участниками. Этот класс предлагает метод, который возвращает ключ сортировки: кортеж, определяющий, как следует сортировать экземпляры. У меня есть словарь, в котором значения являются экземплярами этого класса, индексированными целочисленным идентификатором.

 class Dog:  def __init__(self, name: str, age: int):  self.name = name  self.age = age    def sort_key(self):  return (self.name, self.age)   unsorted = {  111: Dog('Molly', 3),  112: Dog('Sammy', 5),  113: Dog('Leo', 4),  114: Dog('Sammy', 3)  }  

Используя Python 3.6 (где сохраняется порядок словарей), я хотел бы создать словарь, отсортированный по методу класса значения. Моя попытка использует лямбда items() -код для генерации кортежей (ключ, значение), из которых я пытаюсь вызвать метод значения sort_key() :

 # GOAL: sort by name and then age, to produce dictionary with keys ordered 113, 111, 114, 112  result = {k: unsorted[k] for k in sorted(unsorted.items(), key=lambda i: i[1].sort_key())}  

Это вызывает KeyError вопрос . Похоже, проблема не в моем sorted звонке, а в моем понимании словаря.

Ответ №1:

Я обнаружил, что sorted() это возвращало не ключ, а (key, value) кортеж (что, оглядываясь назад, имеет больше смысла).

Моей цели достигло следующее:

 result = {i[0]: i[1] for i in sorted(unsorted.items(), key=lambda i: i[1].sort_key())}