使用类提供的排序键按值对字典进行排序

Posted

技术标签:

【中文标题】使用类提供的排序键按值对字典进行排序【英文标题】:Sorting a dictionary by values, using a class-provided sort key 【发布时间】:2022-01-08 13:01:12 【问题描述】:

我正在使用一个有多个成员的类。这个类提供了一个返回排序键的方法:一个定义实例应该如何排序的元组。我有一个字典,其中的值是此类的实例,由整数标识符索引。

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() 上的lambda 来生成(键,值)元组,我尝试从中调用值的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())

【讨论】:

以上是关于使用类提供的排序键按值对字典进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按值对字典进行排序[重复]

在Python中按值对嵌套字典进行排序,并按另一个值对余数进行排序

如何按值对 Python 字典进行排序? [复制]

当每个字典都有不同的键时,如何按值对字典列表进行排序?

Firebase 按值对类数组进行排序

c# Dictionary 字典的排序问题,请大家指点