在 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))
OrderedDict
是 dict
的子 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
我有一本以对象为值的字典。这些对象是以下 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))
OrderedDict
是 dict
的子 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