在python中一个接一个地将函数列表应用于可迭代

Posted

技术标签:

【中文标题】在python中一个接一个地将函数列表应用于可迭代【英文标题】:apply list of function to an iterable one after another in python 【发布时间】:2021-02-25 05:36:08 【问题描述】:

我有一个函数process,它接收一个函数列表和一个可迭代对象。我想将该列表中的每个函数一个接一个地应用于可迭代。我写的这个很好用,但是......

def process(list_of_funcs, string):
  for func in list_of_funcs:
    string = ''.join(list(map(func, string)))
  return string

ans = process([lambda c: c.upper(), lambda c: c + '0'], "abcd")
print(ans) # A0B0C0D0

我想跳过 for 循环(并以函数式编程方式进行)。在python中有没有办法做到这一点?

【问题讨论】:

如果第一个函数是lambda c: c.upper() * 2,你想得到"AA0BB0CC0DD0"还是"A0A0B0B0C0C0D0D0" 后一个 - A0A0B0B0C0C0D0D0. 【参考方案1】:

您可以将functools.reduce 与参数一起使用

    as function : 将当前函数应用于上一个结果 as sequence : 函数列表 as initial value : 初始字符串
def process(list_of_funcs, string):
    return reduce(lambda res, f: ''.join(map(f, res)), list_of_funcs, string)

注意:不需要中间的listjoin 需要一个iterator


这是一个包含 3 个函数的示例,它提供与初始 for 循环解决方案相同的输出

fcts = [lambda c: c.upper(), lambda c: c + '0', lambda c: c * 2]
ans = process(fcts, "abcd")
print(ans)  # AA00BB00CC00DD00

【讨论】:

以上是关于在python中一个接一个地将函数列表应用于可迭代的主要内容,如果未能解决你的问题,请参考以下文章

python的sort和sorted

List sort()方法

sort() 函数以及lambda匿名函数

序列类型(列表和元祖包括字符串等)通用的的内建函数

python协程函数应用 列表生成式 生成器表达式

python 3.6中的映射函数和迭代