我想使用各种比较器功能在字典中对项目进行排序。 请参阅下面的示例代码。这是使用cmpRatio函数和sorted()的最后一部分,它不起作用。我不确定我做错了什么。提前感谢任何想法!
mydict = { 'a1': (1,6),
'a2': (10,2),
'a3': (5,3),
'a4': (1,2),
'a5': (3,9),
'a6': (9,7) }
# sort by first element of the value tuple: WORKS
print sorted(mydict.iteritems(), key=lambda (k,v): v[0])
# sort by second element of the value tuple: WORKS
print sorted(mydict.iteritems(), key=lambda (k,v): v[1])
# THIS is what I can't get working:
def cmpRatio(x,y):
sx = float(x[0])/x[1]
sy = float(y[0])/y[1]
return sx < sy
# sort by sum of the elements in the value tuple: DOES NOT WORK
print sorted(mydict.iteritems(), key=lambda (k,v): v, cmp=cmpRatio)
答案 0 :(得分:6)
尽可能避免使用cmp
函数,因为它们很慢。必须对每次比较重新评估它们。使用key
使得密钥只需要计算一次。
print sorted(mydict.iteritems(), key=lambda (k,v): float(v[0])/v[1])
另外,你说你想要按值项的总和进行排序,但是你要按差异排序。总和看起来像:
print sorted(mydict.iteritems(), key=lambda (k,v): sum(v))
正如其他答案中所提到的,为了真正想要定义cmp
函数,你没有返回正确的值(必须是-1,0或1)。
return cmp(sx,sy)
但是如果你只是使用lambda来获取值,你可以用itemgetter
替换它,它应该比python端函数更快:
from operator import itemgetter
print sorted(mydict.iteritems(), key=itemgetter(1), cmp=cmpRatio)
如果您尝试存储排序操作,那么存储关键功能会更好:
key_ops = {
'sum': lambda (k,v): sum(v),
'ratio': lambda (k,v): float(v[0])/v[1]),
}
def print_op(aDict, opName):
print sorted(aDict.iteritems(), key=key_ops[opName])
... # some place later in code
print_op(mydict, 'sum')
答案 1 :(得分:4)
当第一个参数是(小于/等于/大于)第二个值时,比较函数应返回(负/零/正)值(与C ++中给予std::sort(...)
的比较器不同)。
即。而不是
return sx < sy
DO
return cmp(sx,sy)
答案 2 :(得分:2)
如果你想按价值元组的总和排序(根据你的评论),你可以使用:
print sorted(mydict.iteritems(), key=lambda v: sum(v[1]))
如果您想按比例排序(根据您的代码):
print sorted(mydict.iteritems(), key=lambda v: float(v[1][0])/v[1][1])