美文网首页
Python 排序不支持原生比较的对象

Python 排序不支持原生比较的对象

作者: 大梦三千秋 | 来源:发表于2020-05-11 19:58 被阅读0次

    排序不支持原生比较的对象

    问题

    想排序类型相同的对象,但是他们不支持原生的比较操作。

    解决方法

    Python 内置的 sorted() 函数能够进线排序,其中有一个关键字参数 key,可以传入一个 callable 对象给它,然后 callable 对象对每个传入的对象返回一个值,这个值会被 sorted 用来排序这些对象。假设,有一个 User 实例,并且希望通过属性 user_id 进行排序,这里就可以提供以实例为输入并输出对应 user_id 值的 callable 对象。示例如下:

    class User(object):
        def __init__(self, user_id):
            self.user_id = user_id
    
        def __repr__(self):
            return 'User({})'.format(self.user_id)
    
    def sort_not_compare():
        users = [User(23),User(3),User(99)]
        print(users)
        print(sorted(users, key=lambda u:u.user_id))
    

    这里还有种方法能够替代 lambda 函数,用 operator.attrgetter()

    >>> from operator import attrgetter
    >>> sorted(users, key=attrgetter('user_id'))
    [User(3),User(23),User(99)]
    >>>
    

    代码解析

    上面提及的是否用 operator.attrgetter() 代替 lambda 函数,这个看个人喜好。但,attrgetter() 有个好处,能够同时允许多个字段进行比较,而且相比较下,执行速度快。下面举例同时对多个字段比较,假设实例 Userfirst_namelast_name 两个属性,则:

    by_name = sorted(users, key=attrgetter('last_name', 'first_name'))
    

    本篇的技术也适用于 max()min() 之类的函数,例如:

    >>> min(users, key=attrgetter('user_id'))
    User(3)
    >>> max(users, key=attrgetter('user_id'))
    User(99)
    >>>
    

    相关文章

      网友评论

          本文标题:Python 排序不支持原生比较的对象

          本文链接:https://www.haomeiwen.com/subject/gqupnhtx.html