使用Python的lambda函数排列字符串数

时间:2013-09-16 05:38:26

标签: python string lambda cmp

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? 在这做什么? 非常感谢你的帮助!

3 个答案:

答案 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_functionkey_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则严格为正收率

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