【Python练习cookbook】实用模块:operator.itemgetter、operator.attrgetter、operator.methodcaller

官方入口:https://docs.python.org/3.7/library/operator.html#module-operator

 

operator.itemgetter(item)

operator.itemgetter(*items)

返回callable对象,调用被操作对象的 __getitem__() 方法:

  • After f = itemgetter(2), the call f(r) returns r[2].

  • After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])

之所以用 itemgetter(2, 5, 3) 而不用(r[2], r[5], r[3]),是因为itemgetter的方式要更快一些,可提升效率

应用(常用于key参数处,代替lambda):

itemgetter(1)('ABCDEFG')
#'B'
itemgetter(1,3,5)('ABCDEFG')
#('B', 'D', 'F')
itemgetter(slice(2,None))('ABCDEFG')
#'CDEFG'

soldier = dict(rank='captain', name='dotterbart')
itemgetter('rank')(soldier)
#'captain'

rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]

rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
#等价于如下,但itemgeter更快
rows_by_fname = sorted(rows, key=lambda r: r['fname'])
rows_by_lfname = sorted(rows, key=lambda r: (r['lname'],r['fname']))

operator.attrgetter(attr)

operator.attrgetter(*attrs)

类似itemgetter,取field值,也是可提高效率。

  • After f = attrgetter('name'), the call f(b) returns b.name.

  • After f = attrgetter('name', 'date'), the call f(b) returns (b.name, b.date).

  • After f = attrgetter('name.first', 'name.last'), the call f(b) returns (b.name.first, b.name.last).

 

class User:
    def __init__(self, user_id):
        self.user_id = user_id

    def __repr__(self):
        return 'User({})'.format(self.user_id)

users = [User(23), User(3), User(99)]

sorted(users, key=attrgetter('user_id'))
#[User(3), User(23), User(99)]

#等价于如下,但更高效
sorted(users, key=lambda u: u.user_id)

operator.methodcaller(name[, args...])

取方法。

  • After f = methodcaller('name'), the call f(b) returns b.name().

  • After f = methodcaller('name', 'foo', bar=1), the call f(b) returns b.name('foo', bar=1).

等价于:

    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值