你想排序类型相同的对象 , 但是它们不支持原生的比较操作 。问题描述你想排序类型相同的对象 , 但是它们不支持原生的比较操作 。
解决方案内置函数sorted()有一个关键字参数key , 可以传入一个callable对象给它 , 这个callable对象对每个传入的对象返回一个值 , 这个值会被sorted用来排序这些对象 。
【1.14 排序不支持原生比较的对象】比如有一个User实例序列 , 你希望通过它们的user_id属性排序 , 那么你可以提供一个以User实例为输入 , 对应的user_id为输出的callable对象 。比如如下的lambda函数:
class User:def __init__(self, user_id):self.user_id = user_iddef __repr__(self):return 'User({})'.format(self.user_id)def sort_users():users = [User(23), User(3), User(99)]print(users)print(sorted(users, key=lambda u: u.user_id)) """sort_users()输出结果:[User(23), User(3), User(99)][User(3), User(23), User(99)]"""也可以用operator.attrgetter()替代lambda函数:
from operator import attrgettersorted(users, key=attrgetter('user_id'))讨论通常attrgetter()函数运行的更快一些 , 并且可以支持多字段比较 。这个跟operator.itemgetter()函数作用于字典类型很类似(参考1.13小节) 。例如 , 如果User实例还有一个name属性 , 那么可以像这样排序:sorted(users, key=attrgetter('user_id', 'name')) 。
同样的 , 这一方法也适用于像min()和max()之类的函数 。比如:
min(users, key=attrgetter('user_id'))# User(3)max(users, key=attrgetter('user_id'))# User(99)
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
