a=['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(cmp=lambda x,y:cmp(len(x),len(y)))
print a
对于我的无知感到抱歉,我不明白这个lambda函数是如何工作的,我所知道的cmp是给+1/1/0来显示比较结果,len给出了字符串的长度 lambda函数如何获取参数?成对?第1,第2,第3,第4? 在这做什么? 非常感谢你的帮助!
答案 0 :(得分:3)
为什么不使用key
?
a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(key=len)
如果你想对cmp
使用旧式排序,你可以定义函数cmp like this:
该函数应该将两个参数进行比较,然后返回 小于的负值,如果它们相等则返回零,或者 返回大于
的正值
所以在你的情况下它可能是这样的:
a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(cmp=lambda x, y: len(x) - len(y))
此函数用于比较基于比较的排序中的两个元素(Timsort,如果我没有记错的话)
答案 1 :(得分:2)
使用常规功能
可能更容易理解def cmp_function(x, y):
return cmp(len(x), len(y))
a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(cmp=cmp_function)
print a
lambda函数实际上并不比常规函数更好。记录和测试更难。
除此之外:在Python2中不推荐使用cmp
,因此您应该使用键功能。
def key_function(x):
return len(x)
a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(key=key_function)
print a
在@ Roman的回答中,这个key_function
只是len
的包装,所以你可以写
a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(key=len)
print a
作为练习,您可以向cmp_function
和key_function
添加打印语句 - 查看每次调用的次数。将其与a
答案 2 :(得分:1)
Roman Pekar解释了应该如何这样做。
但为什么你的版本有用?
这里有两个不同的名为cmp
的东西:
a.sort(cmp=lambda x,y:cmp(len(x),len(y)))
首先,cmp=
表示您将函数作为名为cmp
的关键字参数传递。正如the docs解释(在注释8中):
cmp指定两个参数(列表项)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否小于,等于或大于第二个参数:cmp = lambda x,y:cmp(x.lower(),y.lower())。默认值为None。
其次,你传递给它的是内置cmp
函数的包装器,它执行此操作:
比较两个对象x和y并根据结果返回一个整数。如果x <1,则返回值为负。 y,如果x == y则为零,如果x> 0则严格为正收率
因此,您要比较两个列表项x
和y
,它应该调用cmp(len(x), len(y))
。换句话说,按长度排序。
如果您不理解lambda x, y: cmp(len(x), len(y))
的含义......
lambda
表达式只是在表达式中间定义简单函数的一种方法。这样:
lamdba a, b, c: <some expression>
...定义完全相同的函数:
def f(a, b, c): return <expression>
...除了它没有名称,并且可以在表达式的中间使用。因此,您的lambda
与以下内容相同:
def f(x, y): return cmp(len(x), len(y))
本教程的Lambda forms部分解释了这一点......虽然不再深入,但参考文档的Lambdas部分只是稍微详细一些。
正如gnibbler和Roman都指出的那样,使用cmp
而不是key
已被弃用(并且在Python 3中是非法的),除非你真的需要使用Python 2.3,否则不应该这样做或更早。
正如gnibbler所指出的那样,当你不需要时使用lambda
会导致混淆。
所以,Roman的答案正是你应该做的而不是这个。
文档中的Sorting HowTo对所有这些都有很好的解释。