琐碎的算子

Her*_*ert 7 python functor python-3.x

我经常写代码如下:

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

在哪里我想写:

sorted(some_dict.items(), key=idx_f(1))
sorted(list_of_dicts, key=idx_f('name'))
map(attr_f('name'), rows)
Run Code Online (Sandbox Code Playgroud)

使用:

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

def idx_f(field):
  return lambda x: x[field]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 11

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)
Run Code Online (Sandbox Code Playgroud)

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

# 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'))
Run Code Online (Sandbox Code Playgroud)

attrgetter()函数还接受虚线名称,您可以在其中获取属性的属性:

# extract contact names
map(attrgetter('contact.name'), companies)
Run Code Online (Sandbox Code Playgroud)