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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM