浅析Python中的多条件排序实现


Posted in Python onJune 07, 2016

多条件排序及itemgetter的应用
曾经客户端的同事用as写一大堆代码来排序,在得知Python排序往往只需要一行,惊讶无比,遂对python产生浓厚的兴趣。
之前在做足球的积分榜的时候需要用到多条件排序,如果积分相同,则按净胜球,再相同按进球数,再相同按失球数。
即按积分P、净胜球GD、进球GS、失球GA这样的顺序。
在python中,排序非常方便,排序的参数主要有key、reverse。参数cmp不建议使用了,在python3.0被移除了,用参数key代替。
对于多条件排序,也非常简单,只需要记住下面这句话就行。 即参数key指定的函数返回一个元组,多条件排序的顺序将按照元组的顺序。
看了下面的代码你就明白了,下面是2010世界杯小组赛A组的积分榜。

teamitems = [{'team':'France'   , 'P':1 , 'GD':-3 , 'GS':1 , 'GA':4}, 
      {'team':'Uruguay'   , 'P':7 , 'GD':4 , 'GS':4 , 'GA':0}, 
      {'team':'SouthAfrica' , 'P':4 , 'GD':-2 , 'GS':3 , 'GA':5}, 
      {'team':'Mexico'   , 'P':4 , 'GD':1 , 'GS':3 , 'GA':2}] 
 
print sorted(teamitems ,key = lambda x:(x['P'],x['GD'],x['GS'],x['GA']),reverse=True)

输出

[{'P': 7, 'GD': 4, 'GS': 4, 'GA': 0, 'team': 'Uruguay'}, 
 {'P': 4, 'GD': 1, 'GS': 3, 'GA': 2, 'team': 'Mexico'}, 
 {'P': 4, 'GD': -2, 'GS': 3, 'GA': 5, 'team': 'SouthAfrica'}, 
 {'P': 1, 'GD': -3, 'GS': 1, 'GA': 4, 'team': 'France'}]

即小组排名是乌拉圭、墨西哥、南非、法国。

不过这样一个个取字典的键值有点??拢??temgetter更简洁优雅,上面那句代码可以用如下替换。

from operator import itemgetter 
print sorted(teamitems ,key = itemgetter('P','GD','GS','GA'),reverse=True)

有的升序有的降序的情况下怎么多条件排序
之前在统计导出各区服玩家消费的时候需要进行升序降序混搭的多条件排序。
需求是这样的。区服从小到大排,如果区服相同,则按消费从大到小排。
实现方法是利用python的sort算法是稳定排序,对数据进行多次排序,先排次要条件,后排主要条件。
还有一种更简洁的一行流的方法,不过只有当待排数据是数值的时候才有效。此方法利用相反数的性质,在前面加个负号。
下面上代码。

#假设数据如下。 
data = ''''' 
区服,玩家id,累积消费 
3,a,2380 
1,b,11900 
4,e,3250 
1,k,100 
4,j,599 
2,m,872 
3,f,5560 
1,y,2500 
''' 
 
items = [x.split(',') for x in filter(None,data.split('\n'))[1:]] #去掉空行和忽略首行并把字符串转成二维数组 
#方法一 
items.sort(key=lambda x:int(x[2]),reverse=True)#先排消费 
items.sort(key=lambda x:int(x[0]))#然后排区服 
print '\n'.join([','.join(x) for x in items]) 
print '-----------' 
 
#方法二 
items = sorted(items,key=lambda x:(int(x[0]),-int(x[2]))) 
print '\n'.join([','.join(x) for x in items])

浅析Python中的多条件排序实现

Python 相关文章推荐
python使用sorted函数对列表进行排序的方法
Apr 04 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
Python运算符重载详解及实例代码
Mar 07 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python3最长回文子串算法示例
Mar 04 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
Python解析json代码实例解析
Nov 25 Python
python不同系统中打开方法
Jun 23 Python
Pycharm快捷键配置详细整理
Oct 13 Python
opencv实现图像平移效果
Mar 24 Python
Python卸载模块的方法汇总
Jun 07 #Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 #Python
PyCharm使用教程之搭建Python开发环境
Jun 07 #Python
Python使用Pycrypto库进行RSA加密的方法详解
Jun 06 #Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 #Python
Python第三方库的安装方法总结
Jun 06 #Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 #Python
You might like
php+dbfile开发小型留言本
2006/10/09 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
php创建多级目录的方法
2015/03/24 PHP
php实现图片缩略图的方法
2016/03/29 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
asm.js使用示例代码
2013/11/28 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python协程的用法和例子详解
2017/09/09 Python
Python基于百度云文字识别API
2018/12/13 Python
Python中一些深不见底的“坑”
2019/06/12 Python
python实现websocket的客户端压力测试
2019/06/25 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
如何获得EntityManager
2014/02/09 面试题
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
小学家长意见怎么写
2015/06/03 职场文书