关于python里sort的疑问

[复制链接]
查看11 | 回复2 | 2011-3-19 06:19:18 | 显示全部楼层 |阅读模式
在网上看到这么几段代码,有些疑惑。

a=range(10)
b=a[::-1]
a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
c=zip(a,b)
c
[(0, 9), (1,8), (2, 7), (3, 6), (4, 5), (5, 4), (6, 3), (7, 2), (8, 1), (9, 0)]

c.sort(key=lambda x:x[0])
c
[(0, 9), (1,8), (2, 7), (3, 6), (4, 5), (5, 4), (6, 3), (7, 2), (8, 1), (9, 0)]

c.sort(key=lambda x:x[1])
c
[(9, 0), (8, 1), (7, 2), (6, 3), (5, 4), (4, 5), (3, 6), (2, 7), (1,8), (0, 9)]
疑惑:c.sort(key = lambda x:x[0]) 与c.sort(key = lambda x:x[1])无法理解。key的使用是为其提供一个函数,通过此函数为每个元素创建一个键,所有元素根据键来排序。那么这里的函数就是lambda x : x[0]x[0]是什么?是指每个元组里的第一个元素?那就是说按照元组里第一个元素的大小进行排序,那为什么不是对列表里的元素(即元组)进行排序而是对列表里的元组里的元素进行了排序?
还有这个:
L = [(\'b\',2),(\'a\',1),(\'c\',3),(\'d\',4)]
L.sort(cmp = lambda x,y:cmp(x[1],y[1]))
L
[(\'a\', 1), (\'b\', 2), (\'c\', 3), (\'d\', 4)]
这里对元组进行了排序,又是什么原理?是不是因为提供了两个参数x,y?

这个就更费解了:
import random
def f(x,y):return random.randint(1,2)*2-3

a=range(10)
print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a.sort(f)
print a
[3, 1, 8, 5, 2, 9, 0, 4, 6, 7]
f()为什么要提供两个参数?a.sort(f)到底是什么原理?有人说f(x,y)无论输入什么返回值都是-1或1是原因。也有人说只要f()返回的是随机值便行?原理是什么?
回复

使用道具 举报

千问 | 2011-3-19 06:19:18 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">例1
c是一个list,list中的每一个元素都是一个tuple,如c[0]=(0,9), c[1]=(1,8)

key的作用是指定待排序list(此处即C)中的元素中用来作为排序依据的属性

上例中的key为匿名方法,分别以c[0], 和 c[1] 作为排序依据,所以有这个结果

cmp的作用是指定比较的标准,如升序,逆序等等

例2
L中的元素是tuple,cmp的作用是对L[1]和L[j][1],使用内置cmp方法比较大小,由于L[1]是int,因此最后按升序排列

你可以考虑这样一个例子, 有一个类Person, 有两个属性,Person.age, Person.gender

key的作用是可以指定按年龄还是按性别排序,cmp的作用是可以指定排序的标准(例如以年龄排序时升序还是降序,以性别排序时何种性别在前)

例3
randint的作用是随机生成指定范围的整数,由于此处范围是1到2,所以randint总是生成1或2
因此f随机返回-1和1

以f作为cmp参数时,得到乱序结果

















<h4 class=\"ask\">追问





<pre class=\"replyask-text\" id=\"content-1815044\">谢谢你了,说的挺细的,前面两个例子我懂了,第3个还是不明白。randint的作用我知道,我只是不明白为什么以f作为cmp参数时得到乱序结果。为什么f需要两个参数?为什么是a.sort(f)而不是a.sort(f())?
回复

使用道具 举报

千问 | 2011-3-19 06:19:18 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-1836965\">因为这里f是作为cmp方法传入的,cmp方法需要接受2个参数

你可以按java的思路这样理解sort中的cmp方法,它implement一个interface,这个interface要求它能接受2个参数想x,y,并在x先于y时返回负值,x后于y时返回正值,两者先后程度相同时返回0

python中没有interface,它的形式就是interface,所以这里即使f根本不用它的参数,它也一定要定义两个参数

另外,f是对方法的引用,f()是方法的返回值,所以传入的是f
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行