您的位置:首页 > 编程语言 > Python开发

python 系统学习笔记(十四)---排序

2013-03-12 12:00 585 查看
在 Python 中, 当需要对一个 list 排序时, 一般可以用 list.sort() 或者 sorted(iterable[, cmp[, key[, reverse]]]).

其中:

cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即用内建的比较函数.

key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.

reverse 是一个布尔值, 表示是否反转比较结果.

1.cmp

我们希望按照自己定义的排序规则来排序(例如,按关键词的权重排序,按人的年龄排序,等等)。

若List中每个元素都是2-tuple,tuple中第一个元素为String类型的keyword,第二个元素为该字符串对应的权重(int类型),希望按照权重排序(从高到低),则可以这样:

def my_cmp(E1, E2):

return -cmp(E1[1], E2[1]) #compare weight of each 2-tuple

#return the negative result of built-in cmp function

#thus we get the descend order

L = [('a', 11), ('b', 10), ('c', 12)]

L.sort(my_cmp)

print L

2.按照key 排序 这个会比cmp 执行次数少

def my_key(E1):

return E1[1] #return key 11,10,12

L = [('a', 11), ('b', 10), ('c', 12)]

L.sort(key=my_key,reverse=1) #key 大到小 reverse=0 时候从小到大

print L

3. itemgetter 返回 多排序

简单介绍itemgetter

from operator import itemgetter, attrgetter

a = [1,2,3]

b=itemgetter(1)

print  b(a)

b=itemgetter(1,0)

print b(a)

b=itemgetter(1)

print  b(a)

b=itemgetter(1,0)

print b(a)


按照key排序

from operator import itemgetter, attrgetter

L = [('a', 11), ('b', 10), ('c', 12)]

L.sort(key=itemgetter(1))

print L


按照key (1,2)排序 11 11 12为主 B A C 次要排序

from operator import itemgetter, attrgetter

L = [('a', 11,'B'), ('b', 11,'A'), ('c', 12,'C')]

L.sort(key=itemgetter(1,2))

print L


4 对由字典排序

d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}

sorted(d.iteritems(), key=itemgetter(1), reverse=True)

print d


返回pair
d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}
a=sorted(d.iteritems(), key=itemgetter(1), reverse=True)
print a


习题

把1 和2 的内容用 lambda 实现
#1.
L = [('a', 11), ('b', 10), ('c', 12)]
L.sort(lambda elem1,elem2: cmp(elem1[1],elem2[1]))
print L
#2.
L = [('a', 11), ('b', 10), ('c', 12)]
L.sort(key=lambda elem: elem[1])
print L
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: