我有一个值列表,我想根据自己定义的比较进行排序。我知道你不能排序词典。这是重要的代码:
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)
答案 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))