问题陈述

我想将函数列表fs = [ f, g, h ]按顺序应用于字符串text=' abCdEf '

大约f( g( h( text) ) ),其中f,g,h in fs

这可以通过以下代码轻松实现:

# initial text
text = '  abCDef   '

# list of functions to apply sequentially
fs = [str.rstrip, str.lstrip, str.lower]

for f in fs:
    text = f(text)

# expected result is 'abcdef' with spaces stripped, and all lowercase
print(text)

使用列表理解

我try 使用列表理解,但它只是创建了每个函数调用的列表:

[ f(text) for f in fs ]

['   abCDef', 'abCDef   ', '   abcdef    ']

使用工具.减少

似乎functools.reduce应该在这里完成这项工作,因为它在每次迭代中"消耗"函数列表.

from functools import reduce

reduce(f(text), fs)

# first interaction should call
y = str.rstrip('   abCDef   ')  --> '    abCDef' 

# next iterations fails, because tries to call '   abCDef'() -- as a function 

不幸的是,这段代码不起作用,因为每次迭代都会返回函数的string个istead,但以TypeError: 'str' object is not callable个istead失败.

QUESTION: Is there any solution using map, reduce or list comprehension to this problem?

推荐答案

reduce可以接受三个参数:

reduce(function, iterable, initializer)

这三个论点大体上是什么?

  • function是两个参数的函数.让我们把这两个参数称为tf.
  • 第一个参数t将以initializer开头;然后将继续作为前一次function调用的返回值.
  • 第二个参数f取自iterable.

在我们的 case 中,这三个论点是什么?

  • iterable是你的函数列表;
  • 第二个参数f将是函数之一;
  • 第一个参数t必须是文本;
  • 初始值设定项必须是初始文本;
  • 返回function必须是结果文本;
  • function(t, f)一定是f(t).

最后:

from functools import reduce

# initial text
text = '  abCDef   '

# list of functions to apply sequentially
fs = [str.rstrip, str.lstrip, str.lower]

result = reduce(lambda t,f: f(t), fs, text)

print(repr(result))
# 'abcdef'

Python相关问答推荐

csv 数据以逗号结尾 |Python |

按特定顺序移动对象数组中的字母

绘制 Z 取决于 X 和 Y 向量的曲面

深度列表计数 - 计算列表中的列表

创建包含特定元素的数组列表

填充数据框中未明确说明的值

将多个 csv 文件读入单个数据帧并根据原始文件重命名列 - Pandas

元素不可交互,即使元素在浏览器的视图中

如何使用 Lambda 赋予 HTTP API 或 REST API 不更新的能力?

是否可以在 PyTorch 中的 torch.nn.Sequential 中的 torch.nn.Flatten 之后自动调整层的后续输入?

我正在try 堆叠、融化、grouby 或reshape Pandas DataFrame

在 pandas 中舍入一个范围

Visual Studio Code 在“窗口没有响应”之后冻结

我通过postman 获得状态代码 200,但通过 request.get 我获得状态代码 500

如何获取html表中每一行的特定列的值?

Sympy 反函数:y = ax+b 变为 x = (y-b)/a

在 Pandas 中的列之间搜索范围内的值(不是日期列和没有 sql)

根据 Pandas Groupby 中的组合标准添加新列

从 csv 导入数据 - 无法将字符串转换为浮点数

Haystack 为预测指定列