浅析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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
Python中有趣在__call__函数
Jun 21 Python
python WindowsError的错误代码详解
Jul 23 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 Python
python实现祝福弹窗效果
Apr 07 Python
python3人脸识别的两种方法
Apr 25 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
python 实现list或string按指定分段
Dec 25 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python实现为PDF去除水印的示例代码
Apr 03 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
人族 Terran 基本策略
2020/03/14 星际争霸
实用函数10
2007/11/08 PHP
php时间不正确的解决方法
2008/04/09 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
50个比较实用jQuery代码段
2011/09/18 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
python中的decorator的作用详解
2018/07/26 Python
Django 视图层(view)的使用
2018/11/09 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
高中毕业的自我鉴定
2013/12/09 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电