Python中sort、sorted高级排序技巧

在python中对list进行排序有两种方法:

1.用List的成员函数sort进行排序
2.用built-in函数sorted进行排序
sorted与sort除了一个是序列作为参数,一个是序列调用该函数,其他参数几乎完全一致,下面逐一来介绍其用法及效果:

sort说明

help(list.sort)
Help on method_descriptor:
sort(…)
L.sort(cmp=None, key=None, reverse=False) – stable sort IN PLACE;
cmp(x, y) -> -1, 0, 1

sorted说明

help(sorted)
Help on built-in function sorted in module builtin:
sorted(…)
sorted(iterable, cmp=None, key=None, reverse=False) –> new sorted list

iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。

注;一般来说,cmp和key可以使用lambda表达式。

sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。

Sorting basic:

>>> print sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

>>> L = [5, 2, 3, 1, 4]
>>> L.sort()
>>> print L
[1, 2, 3, 4, 5]

Sorting  cmp:
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

Sorting  keys:
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L, key=lambda x:x[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
Sorting  reverse:

>>> print sorted([5, 2, 3, 1, 4], reverse=True)
[5, 4, 3, 2, 1]

>>> print sorted([5, 2, 3, 1, 4], reverse=False)
[1, 2, 3, 4, 5]

注:效率key>cmp(key比cmp快)

在Sorting Keys中:我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?

L = [(‘d’,2),(‘a’,4),(‘b’,3),(‘c’,2)]
print sorted(L, key=lambda x:(x[1],x[0]))
[(‘c’, 2), (‘d’, 2), (‘b’, 3), (‘a’, 4)]

字典

1.sorted函数按key值对字典排序

>>>d={'A':3,'C':1,'B':2}
>>>sorted(d.keys())
['A', 'B', 'C']
>>>

直接使用sorted(d.keys())就能按key值对字典排序,这里是按照顺序对key值排序的,如果想按照倒序排序的话,则只要将reverse置为true即可。

2.sorted函数按value值对字典排序

要对字典的value排序则需要用到key参数,在这里主要提供一种使用lambda表达式的方法,如下:

>>>d={'A':3,'C':1,'B':2}
>>>sorted(d.items(),key=lambda item:item[1])

这里的d.items()实际上是将d转换为可迭代对象,迭代对象的元素为[(‘A’, 3), (‘C’, 1), (‘B’, 2)],items()方法将字典的元素转化为了元组,而这里key参数对应的lambda表达式的意思则是选取元组中的第二个元素作为比较参数(如果写作key=lambda item:item[0]的话则是选取第一个元素作为比较对象,也就是key值作为比较对象。lambda x:y中x表示输出参数,y表示lambda函数的返回值),所以采用这种方法可以对字典的value进行排序。注意排序后的返回值是一个list,而原字典中的名值对被转换为了list中的元组。

3.实战练习

设有n个正整数,将他们连接成一排,组成一个最大的多位整数.
例如:3个整数13,312,343,连成的最大整数为:34331213
又如:4个整数7,13,4,246连接成的最大整数为7424613
现在给你一个正整数列表L,请你输出用这些正整数能够拼接成的最大整数。
note:测试数据已于2014年11月13日更新,以前通过的代码不一定能够再次通过。

运用sorted代码如下:

maxlen = len(str(max(L)))
b = [{'old':str(x),'new':str(x)+str(x)[-1]*(maxlen-len(str(x)))}  for x in L]
#print b
tmpret = [value["old"] for value in sorted(b,key=lambda s:s["new"],reverse=True)]
print(''.join(tmpret))

输出结果:

b= [{‘new’: ‘777’, ‘old’: ‘7’}, {‘new’: ‘133’, ‘old’: ‘13’}, {‘new’: ‘444’, ‘old’: ‘4’}, {‘new’: ‘246’, ‘old’: ‘246’}]
7424613

b中包含了多个字典,如何对每个字典中的‘new’进行排序呢?

参考网址:
http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html
http://www.jb51.net/article/57678.htm

http://blog.csdn.net/tangtanghao511/article/details/47810729

特别推荐:
http://www.cnblogs.com/yushuo1990/p/5880041.html

  • 22
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值