浅析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实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python脚本实现格式化css文件
Apr 08 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
PyTorch中反卷积的用法详解
Dec 30 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
利用Python发送邮件或发带附件的邮件
Nov 12 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 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
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
django批量导入xml数据
2016/10/16 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
基于Django实现日志记录报错信息
2019/12/17 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
签约仪式主持词
2014/03/19 职场文书
业务内勤岗位职责
2014/04/30 职场文书
职工小家建设活动方案
2014/08/25 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL