浅析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读文件逐行处理的示例代码分享
Dec 27 Python
python写的一个squid访问日志分析的小程序
Sep 17 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
带你了解python装饰器
Jun 15 Python
Python探索之修改Python搜索路径
Oct 25 Python
儿童学习python的一些小技巧
May 27 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
便捷提取python导入包的属性方法
Oct 15 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
七个非常实用的Python工具包总结
Jun 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 程式大小
2006/12/06 PHP
php导出CSV抽象类实例
2014/09/24 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
如何编写jquery插件
2017/03/29 jQuery
layui复选框的全选与取消实现方法
2019/09/02 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
Python中join和split用法实例
2015/04/14 Python
详解Python 正则表达式模块
2018/11/05 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
自学python用什么系统好
2020/06/23 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
工程造价专业大专生求职信
2013/10/06 职场文书
高中毕业生个人自我鉴定
2013/11/24 职场文书
促销活动策划方案
2014/01/12 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
聚美优品励志广告词
2014/03/14 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书