浅析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的Django框架中的通用视图
May 04 Python
python实用代码片段收集贴
Jun 03 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
如何用Python合并lmdb文件
Jul 02 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
opencv设置采集视频分辨率方式
Dec 10 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
Python3使用tesserocr识别字母数字验证码的实现
Jan 29 Python
Python使用openpyxl复制整张sheet
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
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
python处理json数据中的中文
2014/03/06 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
人事助理自荐信
2014/02/02 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
环境卫生整治简报
2015/07/20 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
使用Django实现商城验证码模块的方法
2021/06/01 Python
解决mysql的int型主键自增问题
2021/07/15 MySQL
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang