在python中基于自定义比较器对字典项列表进行排序

时间:2013-06-30 21:45:02

标签: python list sorting dictionary tuples

我有一个值列表,我想根据自己定义的比较进行排序。我知道你不能排序词典。这是重要的代码:

def cmpFirstVals(tup1,tup2):
  if tup1[0] > tup2[0]:
    return True
  else:
    return False
def cmpSecondVals(tup1,tup2):
  if tup1[1] > tup2[1]:
    return True
  else:
    return False

因此,两个比较函数采用两个元组的两个元组。它比较两个元组,如果第一个元组更高则返回true,因此如果使用第二个比较器,(0,4)将高于(0,3)。同样地,

cmpFirstVals((4,2),(2,2))

将返回True。

我的dict是用字符串作为键和两个int元组作为值构建的:

d = {'objA':(1,12),'objB':(13,3)} //etc etc etc

我知道可以对列表d.items()进行排序,我最终会在排序列表中构建一个包含前三项的dict,但我需要使用这些比较器进行排序。

我需要知道如何通过这些比较器进行排序?

另外,请注意,如果两个元组具有相同的索引值,则比较器将返回false。 (即cmpFirstVals((4,2),(4,3))将返回false)

2 个答案:

答案 0 :(得分:0)

企业风险管理...

byfirst = sort(somedict.values(), key=operator.itemgetter(0))
bysecond = sort(somedict.values(), key=operator.itemgetter(1))

二进制比较器在2.x中已弃用,在3.x中已删除。

答案 1 :(得分:0)

如果您希望排序列表仅包含值元组:

>>> d = {'objA':(1,12),'objB':(13,3)}
>>> sorted(d.values())
[(1, 12), (13, 3)]
>>> sorted(d.values(), key=lambda t: t[1])
[(13, 3), (1, 12)]

如果你想要dict中值的完整元组:

>>> sorted(d.items(),key=lambda t: t[1][1])
[('objB', (13, 3)), ('objA', (1, 12))]
>>> sorted(d.items(),key=lambda t: t[1][0])
[('objA', (1, 12)), ('objB', (13, 3))]

编辑(根据您的评论):

def f(d,c):
    return sorted(d.items(),key=c) 

print(f(d,lambda t: t[1][0]))  

key接受一项功能。所以你可以这样做:

def cmpFirstVal(t1):
    return t1[1][0]

def cmpSecondVal(t1):
    return t1[1][1]

def f(d,c):
    return sorted(d.items(),key=c) 

print(f(d,cmpFirstVal)) 
print(f(d,cmpSecondVal))