【问题标题】:Trivial functors平凡函子
【发布时间】:2015-06-21 13:23:14
【问题描述】:

我经常写这样的代码:

sorted(some_dict.items(), key=lambda x: x[1])
sorted(list_of_dicts, key=lambda x: x['age'])
map(lambda x: x.name, rows)

我想写的地方:

sorted(some_dict.items(), key=idx_f(1))
sorted(list_of_dicts, key=idx_f('name'))
map(attr_f('name'), rows)

使用:

def attr_f(field):
  return lambda x: getattr(x, field)

def idx_f(field):
  return lambda x: x[field]

python 中有没有像 idx_f 和 attr_f 这样的仿函数创建器,它们在使用时是否比 lambda 更清晰?

【问题讨论】:

    标签: python python-3.x functor


    【解决方案1】:

    operator 模块有 operator.attrgetter()operator.itemgetter() 可以做到这一点:

    from operator import attrgetter, itemgetter
    
    sorted(some_dict.items(), key=itemgetter(1))
    sorted(list_of_dicts, key=itemgetter('name'))
    map(attrgetter('name'), rows)
    

    这些函数也接受多个参数,此时它们将返回一个包含每个参数值的元组:

    # sorting on value first, then on key
    sorted(some_dict.items(), key=itemgetter(1, 0))
    
    # sort dictionaries by last name, then first name
    sorted(list_of_dicts, key=itemgetter('last_name', 'first_name'))
    

    attrgetter() 函数还接受点名,您可以在其中访问属性的属性:

    # extract contact names
    map(attrgetter('contact.name'), companies)
    

    【讨论】:

    • 太棒了!我记得以前用过这些方法,但在 Google 上找不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2012-10-17
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多