Python: attrgetter()函数: 排序不支持原生比较的对象
问题: 想排序类型相同的对象,但是他们不支持原生的比较操作。
answer:
内置的sorted()函数有一个关键字参数key,可传入一个callable对象给它
这个callabel对象对每个传入的对象返回一个值,这个值被sorted()用来排序这些对象
eg:
1.lambda 函数
有一个User 实例序列,希望通过他们的user id 属性进行排序,可提供一个以User 实例作为输入并输出对应user id 值的callable 对象
class User:
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return 'User({})'.format(self.user_id)
def sort_notcompare():
users = [User(23), User(3), User(99)]
print(users)
print(sorted(users, key=lambda u: u.user_id))
2.operator.attrgetter()
另外一种方式是使用operator.attrgetter() 来代替lambda 函数:
>>> from operator import attrgetter
>>> sorted(users, key=attrgetter('user_id'))
[User(3), User(23), User(99)]
attrgetter() 函数通常会运行的快点,并且还能同时允许多个字段进行比较。
如果User 实例还有一个first name 和last name 属性排序,
>>>by_name = sorted(users, key=attrgetter('last_name', 'first_name'))
3.min() 和max()
适用于像min() 和max() 之类的函数。
>>> min(users, key=attrgetter('user_id')
User(3)
>>> max(users, key=attrgetter('user_id')
User(99)
- Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
- [00014]排序不支持原生比较的对象
- python排序sorted()与operator.itemgetter()函数
- JS-比较函数中嵌套函数,可以排序【对象数组】
- Python: 字典列表: itemgetter 函数: 根据某个或某几个字典字段来排序列表
- python中的堆支持自定义的比较函数 - Heap in Python with comparator.
- 【python学习笔记】python中的模块,类,函数,对象,实例(与JAVA的比较)
- python 面向对象中一些常用内建函数【getattr(), setattr(). hasattr(). delattr()...】
- python 面向对象中一些常用内建函数【getattr(), setattr(). hasattr(). delattr()...】
- Python 不同对象比较大小示例探讨
- Python 不同对象比较大小
- 7.Python进阶_函数对象
- Python的exec()函数引发c语言的面向对象
- 比较器的使用,实现 Comparable接口,功能:实现对象的多条件比较,排序
- 利用比较接口实现List中的对象排序
- python文件open()函数参数:r和rb比较
- JS对象比较函数,引发angular的ng-option异常
- Python进阶07 函数对象
- 零基础学python-15.4 函数的多态vs对象的多态
- STL函数对象:与函数指针的比较