Say I have list with elements content = ['121\n', '12\n', '2\n', '322\n'] and list with functions fnl = [str.strip, int].
So I need to apply each function from fnl to each element from content sequentially.
I can do this by several calls 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.
Without separate function? By single expression?
解决方案
You could use the reduce() function in a list comprehension here:
[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)).
In Python 3, reduce() was moved to the functools module; for forwards compatibility, you can import it from that module from Python 2.6 onwards:
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('121\n') works without stripping of the newline.