[英]Python: apply list of functions to each element in list
Say I have list with elements content = ['121\\n', '12\\n', '2\\n', '322\\n']
and list with functions fnl = [str.strip, int]
. 假设我有元素
content = ['121\\n', '12\\n', '2\\n', '322\\n']
列表,并列出函数fnl = [str.strip, int]
。
So I need to apply each function from fnl
to each element from content
sequentially. 所以我需要将
fnl
每个函数fnl
应用于content
每个元素。 I can do this by several calls map
. 我可以通过几个调用
map
来做到这一点。
Another way: 其他方式:
xl = lambda func, content: map(func, content)
for func in fnl:
content = xl(func, content)
I'm just wondering if there is a more pythonic way to do it. 我只是想知道是否有更多的pythonic方式来做到这一点。
Without separate function? 没有单独的功能? By single expression?
通过单一表达?
You could use the reduce()
function in a list comprehension here: 您可以在列表推导中使用
reduce()
函数 :
[reduce(lambda v, f: f(v), fnl, element) for element in content]
Demo: 演示:
>>> content = ['121\n', '12\n', '2\n', '322\n']
>>> fnl = [str.strip, int]
>>> [reduce(lambda v, f: f(v), fnl, element) for element in content]
[121, 12, 2, 322]
This applies each function in turn to each element, as if you nested the calls; 这会依次将每个函数应用于每个元素,就像嵌套调用一样; for
fnl = [str.strip, int]
that translates to int(str.strip(element))
. for
fnl = [str.strip, int]
转换为int(str.strip(element))
。
In Python 3, reduce()
was moved to the functools
module ; 在Python 3中,
reduce()
被移动到functools
模块 ; for forwards compatibility, you can import it from that module from Python 2.6 onwards: 为了向前兼容,您可以从Python 2.6开始从该模块导入它:
from functools import reduce
results = [reduce(lambda v, f: f(v), fnl, element) for element in content]
Note that for the int()
function, it doesn't matter if there is extra whitespace around the digits; 请注意,对于
int()
函数,数字周围是否有额外的空格并不重要; int('121\\n')
works without stripping of the newline. int('121\\n')
可以在不删除换行符的情况下工作。
You are describing the basic use of a list comprehension: 您正在描述列表理解的基本用法:
>>> content = ['121\n', '12\n', '2\n', '322\n']
>>> [int(n) for n in content]
[121, 12, 2, 322]
Note you don't need the call to strip
to convert to integer here, some whitespace is handled fine. 请注意,这里不需要调用
strip
来转换为整数,一些空格处理得很好。
If your real use-case is more complex and you wish to compose arbitrarily many functions in the comprehension, however, I found the idea from here quite pythonic: 如果您的真实用例更复杂,并且您希望在理解中任意编写许多函数,那么,我发现这里的想法非常pythonic:
def compose(f1, f2):
def composition(*args, **kwargs):
return f1(f2(*args, **kwargs))
return composition
def compose_many(*funcs):
return reduce(compose, funcs)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.