在 class 的字段上对 dict() 进行排序

Sorting dict() on field of class

我有一本以对象为值的字典。这些对象是以下 class 的实例:

Class A():

    def __init__(self, x=''):
        self.x = x
        self.count = 0

字典条目因此将采用以下形式:{'some_key', instance_of_class_A}

现在,我想根据 instance_of_A 中 A.count 的值对字典进行排序。

我通过多次搜索都没有找到这个问题的答案,所以我希望以前有人解决过这个问题! 谢谢 P.

假设您使用的 Python 版本提供有保证的排序,您需要创建一个新的字典,以正确的顺序插入元素。

old_dict = { ... }
new_dict = dict(sorted(old_dict.items(), key=lambda kv: kv[1].count))

要对字典的值进行排序,您可以执行以下操作:

sorted_values = sorted(dict.values(), key=lambda x: x.count)

不过,我认为没有必要对整本词典进行排序。如果键值可以包含 A 个对象的列表并且您想要对其进行排序:

dict[key] = sorted(dict[key], key=lambda x: x.count)

虽然字典在 Python 3.6(作为实现细节)和 3.7+ 中正式插入排序,但对于健壮的有序字典,请使用 collections.OrderedDict:

from collections import OrderedDict

res = OrderedDict(sorted(d.items(), key=lambda x: x[1].count))

OrderedDictdict 的子 class,因此您应该不会失去任何功能。

如果这样的顺序对于您的 class 对象是 自然典型,请考虑定义 __eq____lt__ 方法到您的 class as described here 然后使用:

from operator import itemgetter

res = OrderedDict(sorted(d.items(), key=lambda x: x[1]))
res = OrderedDict(sorted(d.items(), key=itemgetter(1)))  # functional equivalent