gpt4 book ai didi

具有用户定义的 cmp 函数的 python 排序函数

转载 作者:太空狗 更新时间:2023-10-29 20:50:19 25 4
gpt4 key购买 nike

我想使用各种比较器函数对字典中的项目进行排序。请在下面查看我的示例代码。这是最后一部分使用 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)

最佳答案

尽可能避免使用 cmp 函数,因为它们很慢。每次比较都必须重新评估它们。使用 key 可以使 key 只需要计算一次。

print sorted(mydict.iteritems(), key=lambda (k,v): float(v[0])/v[1])

另外,你说你想按值(value)项的总和排序,但你却按差值排序。总和看起来像:

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')

关于具有用户定义的 cmp 函数的 python 排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com