您的位置:首页 > 其它

对列表中的字符串,按字符串长度排序

2009-11-28 15:11 239 查看
前些天用到了list的sort方法,sort方法的对于字符串的默认排序是按英文字母的顺序来排序的,可是那并不是我想要的结果,我想按字符串的长度来对list排序,这时就需要用到sort方法的参数。

我用的是key,通过制定key就可以对字符串进行排序了,哈哈。当然也有其他方法,以后发现了在发到博客了,即使很少有人看我的博客。

看一下例子,
>>> list = ['tom','jan','marry','coco']
>>> list
['tom', 'jan', 'marry', 'coco']

对list进行默认排序
>>> list.sort()
>>> list
['coco', 'jan', 'marry', 'tom']

这时我们可以看到,默认的顺序是英文字母顺序,我们可以指定key来解决字符串长度排序的问题,解决方法如下:
>>> list.sort(key=lambda x:len(x))
>>> list
['jan', 'tom', 'coco', 'marry']

看看,解决了。用到了lambda函数,每次看到lambda都要google,这次干脆贴到博客里,查起来容易多了。

在python中使用lambda来创建匿名函数。lambda来源于LISP语言。lambda的形式如下:

lambda arg1,arg2... : <expression>

lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则不同,它在创建函数对象的同时会进行这种操作。这是lambda的第一个特点。lambda的第二个特点是,它只是一个表达式,而不是一个语句。如果单独使它成为了一个语句,比如:

lambda x: print x

如果你在你的python程序中写下了这么一行,那么毫无意义,这一行代码会创建一个函数对象,但马上又给丢弃了,因为你没有使用它的返回值,即那个函数对象。也正是由于lambda只是一个表达式,它可以直接作为list或dictionary的成员,比如:

L = [lamba x: x**2, lambda x: x**3]

在这个地方没有办法用def语句直接代替。第三,lambda表达式在“:”后只能有一个表达式。也就是说,在def中,可以放在return后的也可以放在lambda,不能放在return后也不能放在这里。更本质地说,后面的表达式是能够返回一个值的,不能返回值的不能放在这里。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。当然,通过一些技巧,可以在lambda中实现与if或for相同的功能。比如:if语句可以利用and和or这两个逻辑操作符的“短路”特性来模拟,比如:

((test and [x]) or [y])[0]

这样的话,如果test为真,那么就会计算[x],当然得到的就是[x],由于在or操作符的左边已经得到真值,or的右边就不会被计算,因此得到的是[x][0],最后的结果是x。如果test为假,那么根据and的特性,左边已经为假,右边不会被计算。这时or的左边为假那么就得到[y][0],最后的结果是y。注意在这里不能写成如下的形式:

(test and x) or y

在x为真值时,这种形式与上面这种形式是等价的。但设想这种情况,“如果test为真,则取0,如果test为假,则取[]”,也就是说x本身是一个假值,用上面的形式书写就是:

(test and 0) or []

显然不能达到目的,这个式子永远只会取到[]。因此应该改写成:

((test and [0]) or [[]])[0]

在lambda中循环语句也是可以模拟的,用的是map函数。比如:

F=lambda x: map((lambda y: y**2), x)

当然,这种东西看起来就很复杂,如果可能最好不要嵌套使用lambda。print也是可以模拟的:

import sys

pp = lambda x: sys.stdout.write(str(x)+'/n')

pp(8) ===> 8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: