問題描述
你想排序型別相同的物件,但是它們不支持原生的比較操作,
解決方案
內置函式sorted()有一個關鍵字引數key,可以傳入一個callable物件給它,這個callable物件對每個傳入的物件回傳一個值,這個值會被sorted用來排序這些物件,
比如有一個User實體序列,你希望通過它們的user_id屬性排序,那么你可以提供一個以User實體為輸入,對應的user_id為輸出的callable物件,比如如下的lambda函式:
class User:
def __init__(self, user_id):
self.user_id = user_id
def __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 attrgetter
sorted(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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/397148.html
標籤:Python
