Python:将函数列表应用于列表中的每个元素

时间:2015-05-12 14:14:43

标签: python python-2.7 lambda

假设我有元素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) 

我只是想知道是否有更多的pythonic方式来做它。

没有单独的功能?通过单一表达?

2 个答案:

答案 0 :(得分:10)

您可以在列表推导中使用reduce() function

[reduce(lambda v, f: f(v), fnl, element) for element in content]

演示:

>>> 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]

这将依次将每个函数应用于每个元素,就像嵌套调用一样; fnl = [str.strip, int]转换为int(str.strip(element))

在Python 3中,reduce()被移至functools module;为了向前兼容,您可以从Python 2.6开始从该模块导入它:

from functools import reduce

results = [reduce(lambda v, f: f(v), fnl, element) for element in content]

请注意,对于int()函数,如果数字周围有额外的空格,则无关紧要; int('121\n')无需删除换行符即可运行。

答案 1 :(得分:1)

您正在描述列表理解的基本用法:

>>> content = ['121\n', '12\n', '2\n', '322\n']
>>> [int(n) for n in content]
[121, 12, 2, 322]

注意,这里不需要调用strip转换为整数,一些空格处理得很好。

如果您的真实用例更复杂并且您希望在理解中任意编写许多函数,我发现here的想法非常pythonic:

def compose(f1, f2):
    def composition(*args, **kwargs):
        return f1(f2(*args, **kwargs))
    return composition

def compose_many(*funcs):
    return reduce(compose, funcs)