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自动化工具日志查询分析脚本代码实现
Nov 26 Python
在Python中操作字典之clear()方法的使用
May 21 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
python实现任意位置文件分割的实例
Dec 14 Python
pandas删除指定行详解
Apr 04 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
Python Web框架之Django框架Model基础详解
Aug 16 Python
python中random模块详解
Mar 01 Python
Python中常见的导入方式总结
May 06 Python
Python机器学习之PCA降维算法详解
May 19 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
python基础教程之字典操作详解
2014/03/25 Python
Python类的多重继承问题深入分析
2014/11/09 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
课程设计心得体会
2013/12/28 职场文书
平民服装店创业计划书
2014/01/17 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
运动会口号16字
2014/06/07 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Python如何将list中的string转换为int
2022/07/15 Ruby