attrgetter()用法

callable() 函数:
用于检查一个对象是否是可调用的。如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。
对于函数、方法、lambda 函式、 类以及实现了 call 方法的类实例, 它都返回 True。
callable对象表示可以调用的对象

问题: 想排序类型相同的对象,但是他们不支持原生的比较操作。
answer:
内置的sorted()函数有一个关键字参数key,传入一个callable对象给它,这个callabel对象对每个传入的对象返回一个值,这个值被sorted()用来排序这些对象
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)
参考:链接
operator 模块也为属性和项目的查找提供了一些工具。这些工具使得 map(), sorted(), itertools.groupby() 或其他函数 需要的参数的提取更方便更快速。上面的函数有一个共同点,即均接受函数参数。

operator.attrgetter(attr)
operator.attrgetter(*attrs)

返回一个可调用的对象,该对象从运算中获取 ‘attr’ 。如果请求的属性不止一个的话, 返回属性的元组。这些属性的名字可以包括 ‘.’。

比如:

f = attrgetter(‘name’),调用 f(b) 返回 b.name

f = attrgetter(‘name’, ‘date’), 调用 f(b) 返回 (b.name, b.date)

f = attrgetter(‘name.first’, ‘name.last’), 调用 f(b) 返回 (b.name.first, b.name.last)

你可能感兴趣的:(attrgetter()用法)