《Python Cookbook 3rd》笔记(1.14):排序不支持原生比较的对象
排序不支持原生比較的對象
問題
你想排序類型相同的對象,但是他們不支持原生的比較操作。
解法
內(nèi)置的 sorted() 函數(shù)有一個關(guān)鍵字參數(shù) key ,可以傳入一個 callable 對象給它,這個 callable 對象對每個傳入的對象返回一個值,這個值會被 sorted 用來排序這些對象。比如,如果你在應(yīng)用程序里面有一個 User 實例序列,并且你希望通過他們的user id 屬性進行排序,你可以提供一個以 User 實例作為輸入并輸出對應(yīng) user id 值的 callable 對象。比如:
class User:def __init__(self, user_id):self.user_id = user_iddef __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 函數(shù):
>>> from operator import attrgetter >>> sorted(users, key=attrgetter('user_id')) [User(3), User(23), User(99)] >>>討論
選擇使 用 lambda 函數(shù) 或者 是 attrgetter() 可能 取 決于 個人 喜好。 但是,attrgetter() 函數(shù)通常會運行的快點,并且還能同時允許多個字段進行比較。這個跟 operator.itemgetter() 函數(shù)作用于字典類型很類似。例如,如果 User 實例還有一個 first name 和 last name 屬性,那么可以向下面這樣排序:
by_name = sorted(users, key=attrgetter('last_name', 'first_name'))同樣需要注意的是,這一小節(jié)用到的技術(shù)同樣適用于像 min() 和 max() 之類的函數(shù)。比如:
>>> min(users, key=attrgetter('user_id') User(3) >>> max(users, key=attrgetter('user_id') User(99) >>>總結(jié)
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(1.14):排序不支持原生比较的对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Python Cookbook 3rd
- 下一篇: 《剑指Offer》36:二叉搜索树与双向