繁体   English   中英

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]

第一,仅考虑obj1obj2因为它们属于相同的频率,并根据dict y对其值进行排序。 obj2值为50obj1值为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM