浅析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 相关文章推荐
python3简单实现微信爬虫
Apr 09 Python
python图像处理之镜像实现方法
May 30 Python
python2 与python3的print区别小结
Jan 16 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
python实现图像外边界跟踪操作
Jul 13 Python
python如何利用Mitmproxy抓包
Oct 10 Python
python中的被动信息搜集
Apr 29 Python
7个关于Python的经典基础案例
Nov 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设计模式 Composite (组合模式)
2011/06/26 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
利用php输出不同的心形图案
2016/04/22 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python实现邮件自动发送
2019/08/10 Python
python的等深分箱实例
2019/11/22 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
Python线程threading模块用法详解
2020/02/26 Python
如何用Python 加密文件
2020/09/10 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
一份婚庆公司创业计划书
2014/01/11 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
联片教研活动总结
2014/07/01 职场文书
环卫处个人工作总结
2015/03/04 职场文书
初中政治教学反思
2016/02/23 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫