xiº*_*xiº 3 python lambda python-2.7
说我有列表元素content = ['121\n', '12\n', '2\n', '322\n']和列表与功能fnl = [str.strip, int].
所以我需要fnl从content顺序地将每个函数应用到每个元素.我可以通过几个电话来做到这一点map.
其他方式:
xl = lambda func, content: map(func, content)
for func in fnl:
content = xl(func, content)
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更多的pythonic方式来做到这一点.
没有单独的功能?通过单一表达?
Mar*_*ers 10
你可以在列表理解中使用这个reduce()函数:
[reduce(lambda v, f: f(v), fnl, element) for element in content]
Run Code Online (Sandbox Code Playgroud)
演示:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
这会依次将每个函数应用于每个元素,就像嵌套调用一样; 因为fnl = [str.strip, int]这转化为int(str.strip(element)).
在Python 3中,reduce()被移动到functools模块 ; 为了向前兼容,您可以从Python 2.6开始从该模块导入它:
from functools import reduce
results = [reduce(lambda v, f: f(v), fnl, element) for element in content]
Run Code Online (Sandbox Code Playgroud)
请注意,对于该int()函数,如果数字周围有额外的空格并不重要; int('121\n')在没有剥离换行符的情况下工作.