Python:基于字典

时间:2016-03-07 05:34:49

标签: python list sorting 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并根据dict中存在的obj的值进行排序来排序x,我的最终结果应该是

x = [obj2,obj1, obj5,obj3,obj4]

首先考虑obj1obj2,因为它们属于同一频率,并在dict y中查看其值。 obj2值为50obj1值为40

所以列表x现在将进行排序,使其第一个元素为obj2,然后是obj1

并且我必须对属于相同频率的下一组对象执行相同的操作,并根据dict y中的值进行排序 我该怎么做?

2 个答案:

答案 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]
相关问题