浅析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 16 Python
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
wxPython之解决闪烁的问题
Jan 15 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
Django model序列化为json的方法示例
Oct 16 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
python设置中文界面实例方法
Oct 27 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
Python使用mitmproxy工具监控手机 下载手机小视频
Apr 18 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
php车辆违章查询数据示例
2016/10/14 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
js 事件小结 表格区别
2007/08/13 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python切片用法实例教程
2014/09/08 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
树莓派实现移动拍照
2019/06/22 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
《母鸡》教学反思
2014/02/25 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
python基础之类属性和实例属性
2021/10/24 Python
对象析构函数__del__在Python中何时使用
2022/03/22 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android