python - 平凡仿函数

标签 python python-3.x functor

我经常写这样的代码:

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 更清晰?

最佳答案

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)

关于python - 平凡仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964994/

相关文章:

python - 将一列时间戳转换为 pandas 中的句点

python-3.x - 为什么 type(mock.MagicMock()) == mock.MagicMock 返回 False?

haskell - `<*>` 和 `<$>` 之间的关系

python - 列表分配中的字典导致奇怪的输出

python - PEP8 不允许尝试除了阻止

python - 如何清除 IDLE shell 中所有文本的屏幕?

python - 在Python中将CSV空白单元格转换为SQL NULL

python - 在 Python 中将文件从一个位置复制到另一个位置

c++ - 如何确定一个参数是否是一个纯函数指针?

c++ - 这是文档中的一个小错误还是我遗漏了什么?