浅析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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
浅谈Django的缓存机制
Aug 23 Python
python梯度下降法的简单示例
Aug 31 Python
python中强大的format函数实例详解
Dec 05 Python
Python创建或生成列表的操作方法
Jun 19 Python
django表单的Widgets使用详解
Jul 22 Python
Python魔法方法 容器部方法详解
Jan 02 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 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
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
php实现计数器方法小结
2015/01/05 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
js 字符串操作函数
2009/07/25 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
基于Bootstrap表单验证功能
2017/11/17 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python实现自动解数独小程序
2019/01/21 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
主持人婚宴答谢词
2014/01/28 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
文明之星事迹材料
2014/05/09 职场文书
环保建议书500字
2014/05/14 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
督导岗位职责
2015/02/04 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
严以用权学习心得体会
2016/01/12 职场文书
如何解决php-fpm启动不了问题
2021/11/17 PHP