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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Python中偏函数用法示例
Jun 07 Python
python pandas修改列属性的方法详解
Jun 09 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
python 猴子补丁(monkey patch)
Jun 26 Python
基于python的Paxos算法实现
Jul 03 Python
windows上安装python3教程以及环境变量配置详解
Jul 18 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
详解Python多线程下的list
Jul 03 Python
Python读取文件夹下的所有文件实例代码
Apr 02 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
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
php中序列化与反序列化详解
2017/02/13 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
Vue实现按钮级权限方案
2019/11/21 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
py-charm延长试用期限实例
2019/12/22 Python
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
文秘专业个人求职信
2013/12/22 职场文书
食品厂厂长岗位职责
2014/01/30 职场文书
学生自我评价范文
2014/02/02 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
oracle数据库去除重复数据
2022/05/20 Oracle