zoukankan      html  css  js  c++  java
  • 【python cookbook】【数据结构与算法】14.对不原生支持比较操作的对象排序

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

    解决方案:使用内建的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)
  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/apple2016/p/5747275.html
Copyright © 2011-2022 走看看