问题陈述

我想将函数列表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相关问答推荐

时间序列分解

对于一个给定的数字,找出一个整数的最小和最大可能的和

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

如何使用数组的最小条目拆分数组

基于字符串匹配条件合并两个帧

在vscode上使用Python虚拟环境时((env))

使用Python和文件进行模糊输出

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

在Python中计算连续天数

如何排除prefecture_related中查询集为空的实例?

关于两个表达式的区别

Pandas—堆栈多索引头,但不包括第一列

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

504未连接IB API TWS错误—即使API连接显示已接受''

我什么时候应该使用帆布和标签?

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

如何使用Polars从AWS S3读取镶木地板文件

Pandas ,快速从词典栏中提取信息到新栏

如何将django url参数传递给模板&S url方法?

极地数据帧:ROLING_SUM向前看