浅析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 相关文章推荐
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
python PyTorch参数初始化和Finetune
Feb 11 Python
Python实现购物车购物小程序
Apr 18 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
python实现批量修改服务器密码的方法
Aug 13 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
用python拟合等角螺线的实现示例
Dec 27 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python判断元素是否存在的实例方法
Sep 24 Python
python 多线程共享全局变量的优劣
Sep 24 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 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
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
asp.net和php的区别点总结
2019/10/10 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
Python实现两个list对应元素相减操作示例
2017/06/09 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
python版本单链表实现代码
2018/09/28 Python
Python并行分布式框架Celery详解
2018/10/15 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python IP地址转整数
2020/11/20 Python
python安装及变量名介绍详解
2020/12/12 Python
HTML5中5个简单实用的API
2014/04/28 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
中文系师范生自荐信
2013/10/01 职场文书
现金会计岗位职责
2013/12/05 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
怀念母亲教学反思
2014/04/28 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
六年级情感作文之500字
2019/10/23 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript