Python3删除了排序时用于比较的cmp
参数,并将其替换为key
。
引入该cmp_to_key
函数的目的是“主要用作从Python 2转换程序的过渡工具”。
我不清楚如何使用cmp
python3在本地重新创建行为key
。例如,如果我想按长度对字符串进行排序,并按字典顺序使用平局,那么我将编写如下内容:
def compare(word1, word2):
if len(word1) > len(word2):
return 1
if len(word2) > len(word1):
return -1
if word1 < word2:
return 1
if word2 < word1:
return -1
return 0
myStrings.sort(key=functools.cmp_to_key(compare), reverse=True)
如何使用python3-native方式(不带python)进行对象之间的比较cmp_to_key
?
我能想到的一件事是返回一个更复杂的密钥,例如:
# This would return something like 5.12 for "hello" and 5.20 for "world"
def myKey(word):
return len(word) + myLexicographicalValueFunction(word)/100
myStrings.sort(key=myKey, reverse=True)
但是,当您添加更多变量进行比较时,这似乎无法很好地扩展。在python3排序期间使用多个字段进行键评估的pythonic方式是什么?
对于该特定比较,您可以使用元组作为键:
myStings.sort(key=lambda s:(-len(s),s),reverse=True)
对于对象类,您可能需要实现一个比较运算符(例如,def __lt__(self,other):
方法),以使排序知道如何对它们进行本机比较。
如果您无法修改对象类,或者您的比较非常复杂,则可以创建一个包装器对象,该对象__lt__()
使用您所查找的lambda实现该方法:
class ObjectComp:
def __init__(self,instance,cmp):
self.instance = instance
self.cmp = cmp
def __lt__(self,other):
return self.cmp(self.instance,other.instance)
def cmpsort(objects,cmp):
return [obj.instance for obj in sorted(ObjectComp(o,cmp) for o in objects)]
s = cmpsort([1,11,21,12,13],cmp=lambda a,b:a%10>b%10)
print(s)
[13, 12, 1, 11, 21]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句