[英]Sort list of dict based on value present in another list in python
[英]Python: sort list based on value present in dictionary
考虑列表x = [obj1,obj2,obj3,obj4,obj5]
它们按照以下方式分组
obj1.freq = obj2.freq = frequency1
and
obj3.freq = obj4.freq = obj5.freq = frequency2
我有一个命令
y = {obj1 : 40, obj2 :50, obj3:60, obj4:10, obj5:70, obj6:30, obj7:20}
我必须通过考虑相同频率的obj来对x进行排序,并根据dict中存在的obj的值进行排序,我的最终结果应该是
x = [obj2,obj1, obj5,obj3,obj4]
第一,仅考虑obj1
和obj2
因为它们属于相同的频率,并根据dict y
对其值进行排序。 obj2
值为50
而obj1
值为40
。
因此,列表x
现在将进行排序,以使其第一个元素为obj2
后跟obj1
并且我必须对属于同一频率的下一组对象执行相同的操作,并根据dict y中显示的值进行排序。我该怎么做?
好吧,我想您可以通过以下方式做到这一点:
x = [obj1,obj2,obj3,obj4,obj5]
y = {obj1 : 40, obj2 :50, obj3:60, obj4:10, obj5:70, obj6:30, obj7:20}
sorted_list=sorted(lambda e: (e.freq, 0-y[e]), x)
注意,如果要从较大的值到较小的值排序,则需要0-y[e]
。 通常,它可以通过reverse=True
到达,但是在我们的例子中,它也会影响按频率排序
该代码使用元组(frequency, value-in-y)
作为排序键; 该列表以相反的顺序排序,因此最高的频率排在首位(未在问题中指定,如果这是错误的,则可以在-i.freq
使用-i.freq
); 具有频率的对象按元组中的第二项排序(字典y
的值(如果有)或0:
class Obj:
def __init__(self, name, freq):
self.freq = freq
self.name = name
def __repr__(self):
return self.name
obj1 = Obj('obj1',42)
obj2 = Obj('obj2',42)
obj3 = Obj('obj3',6)
obj4 = Obj('obj4',6)
obj5 = Obj('obj5',6)
obj6 = Obj('obj6',332)
obj7 = Obj('obj7',123)
x = [obj2, obj1, obj5, obj3, obj4]
y = {obj1:40, obj2:50, obj3:60, obj4:10, obj5:70, obj6:30, obj7:20}
print(sorted(x, key=lambda i: (i.freq, y.get(i, 0)), reverse=True))
版画
[obj2, obj1, obj5, obj3, obj4]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.