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 正则式 概述及常用字符
May 07 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
python random从集合中随机选择元素的方法
Jan 23 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
python程序输出无内容的解决方式
Apr 09 Python
python 数据库查询返回list或tuple实例
May 15 Python
python框架flask入门之路由及简单实现方法
Jun 07 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php session 预定义数组
2009/03/16 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
javascript实现表单验证
2016/01/29 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
使用python+whoosh实现全文检索
2019/12/09 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
厨师个人自我鉴定范文
2014/04/19 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
作文批改评语
2014/12/25 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
汽车销售员工作总结
2015/08/12 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL