浅析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 HTTP客户端自定义Cookie实现实例
Apr 28 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
利用python批量给云主机配置安全组的方法教程
Jun 21 Python
python 中split 和 strip的实例详解
Jul 12 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
解决python大批量读写.doc文件的问题
May 08 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
Python对象的属性访问过程详解
Mar 05 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
jQuery1.6 使用方法二
2011/11/23 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python中time tzset()函数实例用法
2021/02/18 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
会计出纳岗位职责
2013/12/25 职场文书
大学生读书笔记范文
2015/07/01 职场文书
KTV员工管理制度
2015/08/06 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
解析MySQL索引的作用
2022/03/03 MySQL
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫