Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例


Posted in Python onMarch 15, 2018

本文实例讲述了Python实现对不原生支持比较操作的对象排序算法。分享给大家供大家参考,具体如下:

问题:想在同一个类的实例之间做排序,但是它们并不原生支持比较操作。

解决方案:使用内建的sorted()函数可接受一个用来传递可调用对象的参数key,sorted利用该可调用对象返回的待排序对象中的某些值来比较对象。

from operator import attrgetter
class User:
  def __init__(self, user_id):
    self.user_id = user_id
  def __repr__(self):
    return 'User({})'.format(self.user_id)
# Example
users = [User(23), User(3), User(99)]
print(users)
# Sort it by user-id used lambda表达式
print(sorted(users,key=lambda r:r.user_id))
# Sort it by user-id used operator.attrgetter()
print(sorted(users, key=attrgetter('user_id')))

使用lambda表达式还是operator.attrgetter()或许只是个人偏好,但是operator.attrgetter()更快一些,而且具有允许同时提取多个字段值的能力。

这和针对字典的operator.itemgetter()的使用类似。

from operator import attrgetter
class User:
  def __init__(self, user_id,fname,lname):
    self.user_id = user_id
    self.fname=fname
    self.lname=lname
  def __repr__(self):
    return 'User({},{},{})'.format(self.user_id,self.fname,self.lname)
# Example
users = [User(23,'Brian','Jones'), User(3,'David','Beazley'), User(99,'Aig','Jones')]
print(users)
# Sort it by lname,fname used operator.attrgetter()
print(sorted(users, key=attrgetter('lname','fname')))
>>> ================================ RESTART ================================
>>>
[User(23,Brian,Jones), User(3,David,Beazley), User(99,Aig,Jones)]
[User(3,David,Beazley), User(99,Aig,Jones), User(23,Brian,Jones)]
>>>

最后,本节展示的技术同样适用于min()max()这样的函数:

>>> min(users,key=attrgetter('user_id'))
User(3,David,Beazley)
>>> max(users,key=attrgetter('user_id'))
User(99,Aig,Jones)
>>> max(users,key=attrgetter('fname'))
User(3,David,Beazley)

(代码摘自《Python Cookbook》)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python查找第k小元素代码分享
Dec 18 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
pandas ix &iloc &loc的区别
Jan 10 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
如何在python中判断变量的类型
Jul 29 Python
python绘图pyecharts+pandas的使用详解
Dec 13 Python
python简单商城购物车实例代码
Mar 15 #Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 #Python
python批量实现Word文件转换为PDF文件
Mar 15 #Python
python实现求解列表中元素的排列和组合问题
Mar 15 #Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 #Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 #Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 #Python
You might like
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
在Python中关于中文编码问题的处理建议
2015/04/08 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
python实现二叉查找树实例代码
2018/02/08 Python
Django 大文件下载实现过程解析
2019/08/01 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
Python3爬虫中识别图形验证码的实例讲解
2020/07/30 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
广州品高软件.net笔面试题目
2012/04/18 面试题
AJax面试题
2014/11/25 面试题
自我评价的范文
2014/02/02 职场文书
公司端午节活动方案
2014/02/04 职场文书
组织鉴定材料
2014/06/02 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
三八妇女节寄语
2015/02/27 职场文书
毕业设计工作总结
2015/08/14 职场文书
《假如》教学反思
2016/02/17 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书