1.14 排��支�原生比较的对象¶
问题¶
ä½ æƒ³æŽ’åº�类型相å�Œçš„对象,但是他们ä¸�支æŒ�原生的比较æ“�作。
解决方案¶
内置的 sorted() 函数有一个关键å—å�‚æ•° key ,å�¯ä»¥ä¼ 入一个 callable 对象给它,
这个 callable 对象对æ¯�ä¸ªä¼ å…¥çš„å¯¹è±¡è¿”å›žä¸€ä¸ªå€¼ï¼Œè¿™ä¸ªå€¼ä¼šè¢« sorted 用æ�¥æŽ’åº�这些对象。
æ¯”å¦‚ï¼Œå¦‚æžœä½ åœ¨åº”ç”¨ç¨‹åº�里é�¢æœ‰ä¸€ä¸ª 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))
�外一�方�是使用 operator.attrgetter() �代替 lambda 函数:
>>> from operator import attrgetter
>>> sorted(users, key=attrgetter('user_id'))
[User(3), User(23), User(99)]
>>>
讨论¶
选择使用 lambda 函数或者是 attrgetter() �能�决于个人喜好。
但是, attrgetter() 函数通常会è¿�行的快点,并且还能å�Œæ—¶å…�è®¸å¤šä¸ªå—æ®µè¿›è¡Œæ¯”较。
这个跟 operator.itemgetter() 函数作用于å—典类型很类似(å�‚考1.13å°�节)。
例如,如果 User 实例还有一个 first_name å’Œ last_name 属性,那么å�¯ä»¥å�‘下é�¢è¿™æ ·æŽ’åº�:
by_name = sorted(users, key=attrgetter('last_name', 'first_name'))
å�Œæ ·éœ€è¦�注æ„�的是,这一å°�节用到的技术å�Œæ ·é€‚用于åƒ� min() å’Œ max() 之类的函数。比如:
>>> min(users, key=attrgetter('user_id'))
User(3)
>>> max(users, key=attrgetter('user_id'))
User(99)
>>>