Roman Pekar 解释了你应该如何做到这一点。
但是为什么你的版本有效?
这里命名了两个不同的东西cmp
:
a.sort(cmp=lambda x,y:cmp(len(x),len(y)))
首先,这cmp=
意味着您将函数作为名为cmp
. 正如文档所解释的(在注释 8 中):
cmp 指定两个参数(列表项)的自定义比较函数,该函数应返回负数、零或正数,具体取决于第一个参数被认为小于、等于还是大于第二个参数: cmp=lambda x,y : cmp(x.lower(), y.lower())。默认值为无。
其次,您传递给它的是内置cmp
函数的包装器,它执行以下操作:
比较两个对象 x 和 y 并根据结果返回一个整数。如果 x < y,则返回值为负,如果 x == y,则返回零,如果 x > y,则严格为正。
所以,你说要比较两个列表项x
和y
,它应该调用cmp(len(x), len(y))
. 换句话说,按长度对它们进行排序。
如果你不明白这lambda x, y: cmp(len(x), len(y))
意味着什么……</p>
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 表单部分解释了这一点……虽然没有更深入,参考文档的Lambdas部分只是稍微详细一点。
正如 gnibbler 和 Roman 都指出的那样,不推荐使用cmp
代替key
使用(并且在 Python 3 中是非法的),除非您确实需要使用 Python 2.3 或更早版本,否则不应这样做。
正如 gnibbler 还指出的那样,lambda
在不需要时使用会导致混淆。
所以,罗曼的答案正是你应该做的,而不是这个。
文档中的Sorting HowTo对所有这些都有很好的解释。