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

 更新时间:2018年03月15日 12:00:05   作者:垄上行  
这篇文章主要介绍了Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法,结合实例形式分析了Python针对类实例进行排序相关操作技巧,需要的朋友可以参考下

本文实例讲述了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函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

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

相关文章

  • Python的Django框架实现数据库查询(不返回QuerySet的方法)

    Python的Django框架实现数据库查询(不返回QuerySet的方法)

    这篇文章主要介绍了Python的Django框架实现数据库查询(不返回QuerySet的方法)
    2020-05-05
  • Python字符串的索引与切片

    Python字符串的索引与切片

    这篇文章主要介绍了Python字符串的索引与切片,文章围绕主题展开详细的相关资料,需要的小伙伴可以参考一下
    2022-04-04
  • TensorFlow 多元函数的极值实例

    TensorFlow 多元函数的极值实例

    今天小编就为大家分享一篇TensorFlow 多元函数的极值实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Django auth 应用模块详解

    Django auth 应用模块详解

    这篇文章主要介绍了Django auth 应用模块,auth 模块帮助开发人员提高了工作效率,因为每个 Web 站点的权限管理模块或者用户管理模块基本都是相同的逻辑,Django 的 auth 模块使开发者们不必在为一些重复性的逻辑进行构建,需要的朋友可以参考下
    2022-11-11
  • python迭代器,生成器详解

    python迭代器,生成器详解

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,小编觉得这篇文章写的还不错,需要的朋友可以参考下
    2021-10-10
  • 在Python中表示一个对象的方法

    在Python中表示一个对象的方法

    这篇文章主要介绍了在Python中表示一个对象的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • python数据处理67个pandas函数总结看完就用

    python数据处理67个pandas函数总结看完就用

    这篇文章主要介绍了python数据处理67个pandas函数的梳理总结,看完就可以去用了,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 基于asyncio 异步协程框架实现收集B站直播弹幕

    基于asyncio 异步协程框架实现收集B站直播弹幕

    本文给大家分享的是基于asyncio 异步协程框架实现收集B站直播弹幕收集系统的简单设计,并附上源码,有需要的小伙伴可以参考下
    2016-09-09
  • python Polars库的使用简介

    python Polars库的使用简介

    这篇文章主要介绍了python Polars库的使用简介,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • Python操作Redis数据库的详细教程与应用实战

    Python操作Redis数据库的详细教程与应用实战

    Redis是一个高性能的键值存储数据库,支持多种类型的数据结构,如字符串、哈希表、列表、集合和有序集合等,在Python中,通过redis-py库可以方便地操作Redis数据库,本文将详细介绍如何在Python代码中操作Redis,需要的朋友可以参考下
    2024-08-08

最新评论