考虑列表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并根据dict中存在的obj的值进行排序来排序x,我的最终结果应该是
x = [obj2,obj1, obj5,obj3,obj4]
首先考虑obj1
和obj2
,因为它们属于同一频率,并在dict y
中查看其值。 obj2
值为50
,obj1
值为40
。
所以列表x
现在将进行排序,使其第一个元素为obj2
,然后是obj1
并且我必须对属于相同频率的下一组对象执行相同的操作,并根据dict y中的值进行排序 我该怎么做?
答案 0 :(得分:2)
嗯,我想你可以这样做:
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
到达,但在我们的情况下,它也会影响按频率排序
答案 1 :(得分:2)
此代码使用元组(frequency, value-in-y)
作为排序键;列表按相反的顺序排序,以便最高频率出现(问题中没有指定,如果这是错误的,你可以在那里使用-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]