浅析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记录详细调用堆栈日志的方法
May 05 Python
python3序列化与反序列化用法实例
May 26 Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 Python
Python端口扫描简单程序
Nov 10 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
python 多线程重启方法
Feb 18 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
Python对wav文件的重采样实例
Feb 25 Python
Python软件包安装的三种常见方法
Jul 07 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 常用的header头部定义汇总
2015/06/19 PHP
php和nginx交互实例讲解
2019/09/24 PHP
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
Python面向对象之继承代码详解
2018/01/29 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
Python自省及反射原理实例详解
2020/07/06 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
银行求职推荐信范文
2013/11/30 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
2015年招生工作总结
2015/05/04 职场文书
2016公司年会主持词
2015/07/01 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
浅析Django接口版本控制
2021/06/26 Python