1
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 是如何实现的函数接受参数?成对?参加第一,第二然后第三,第四?在这里做什么?非常感谢您的帮助!

4

3 回答 3

3

为什么不使用key

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(key=len)

如果你想使用旧式排序cmp,你必须这样定义函数 cmp :

该函数应该接受两个参数进行比较,然后返回负值表示小于,如果它们相等则返回零,或者返回正值表示大于

所以在你的情况下,它可能是这样的:

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(cmp=lambda x, y: len(x) - len(y))

此函数用于在基于比较的排序中比较两个元素(Timsort,如果我没记错的话)

于 2013-09-16T05:41:20.873 回答
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 函数实际上并不比这里的常规函数​​好。记录和测试更难。

Aside:cmp在 Python2 中已弃用,因此您应该改用 key 函数。

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

作为练习,您可以添加一个 print 语句,cmp_functionkey_function查看每个语句被调用了多少次。将此与中的项目数进行比较a

于 2013-09-16T05:52:14.673 回答
1

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,则严格为正。

所以,你说要比较两个列表项xy,它应该调用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对所有这些都有很好的解释。

于 2013-09-16T05:54:16.413 回答