浅析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和php通信乱码问题解决方法
Apr 15 Python
windows下wxPython开发环境安装与配置方法
Jun 28 Python
python合并同类型excel表格的方法
Apr 01 Python
解决python中无法自动补全代码的问题
Dec 04 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
python实现BP神经网络回归预测模型
Aug 09 Python
django创建超级用户过程解析
Sep 18 Python
pytorch中的自定义数据处理详解
Jan 06 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
用python实现名片管理系统
Jun 18 Python
Python filter过滤器原理及实例应用
Aug 18 Python
Django mysqlclient安装和使用详解
Sep 17 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python处理大数字的方法
2015/05/27 Python
Python中实现三目运算的方法
2015/06/21 Python
Python 基础知识之字符串处理
2017/01/06 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Python快速排序算法实例分析
2017/11/29 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
茶叶生产计划书
2014/01/10 职场文书
便利店的创业计划书
2014/01/15 职场文书
继承权公证书
2014/04/09 职场文书
法制宣传教育方案
2014/05/09 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
医德医风个人总结
2015/02/28 职场文书
业务员辞职信范文
2015/03/02 职场文书
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers