将功能列表应用于对象列表

时间:2019-02-07 14:49:28

标签: python

有时在R中会出现这种情况,这对我意味着必须要有一种在Python中执行此操作的方法。如果我有功能列表,请说:

functions = [lambda s: s + 'hi world', lambda s: s + '_(O.o)_']

和输入列表:

inputs = ['Buy', 'use', 'break', 'fix', 'trash', 'melt']

如何将提供的所有功能应用于输入列表?对我而言,列表理解似乎允许我将功能之一应用于列表,但不能同时应用于两个功能(无需将功能本身硬编码为代码)。

为澄清起见,在这种情况下,我正在寻找的输出为:

output = ['Buyhi world_(O.o)_', 'usehi world_(O.o)_', 'breakhi world_(O.o)_' ...

简而言之,我正在尝试寻找一种无需编写[f1(f2(f3(i))) for i in inputs]的方法,而只是拥有一个'f'列表并将它们全部应用于输入。

3 个答案:

答案 0 :(得分:6)

使用nested list comprehension

functions = [lambda s: s + 'hi world', lambda s: s + '_(O.o)_']
inputs = ['Buy', 'use', 'break', 'fix', 'trash', 'melt']

outputs = [func(ipt) for func in functions for ipt in inputs]
print(outputs)

输出

['Buyhi world', 'usehi world', 'breakhi world', 'fixhi world', 'trashhi world', 'melthi world', 'Buy_(O.o)_', 'use_(O.o)_', 'break_(O.o)_', 'fix_(O.o)_', 'trash_(O.o)_', 'melt_(O.o)_']

更新

鉴于您的问题有更新,可以使用reduce:

from functools import reduce

functions = [lambda s: s + 'hi world', lambda s: s + '_(O.o)_']
inputs = ['Buy', 'use', 'break', 'fix', 'trash', 'melt']

outputs = [reduce(lambda x, f: f(x), functions, ipt) for ipt in inputs]
print(outputs)

输出

['Buyhi world_(O.o)_', 'usehi world_(O.o)_', 'breakhi world_(O.o)_', 'fixhi world_(O.o)_', 'trashhi world_(O.o)_', 'melthi world_(O.o)_']

答案 1 :(得分:1)

通过这个特定的函数示例,您可以尝试结合使用functools.reduce和列表理解:

from functools import reduce
functions = [lambda s: s + 'hi world', lambda s: s + '_(O.o)_']
inputs = ['Buy', 'use', 'break', 'fix', 'trash', 'melt']

[reduce(lambda inp, f: f(inp), functions, i) for i in inputs]

# ['Buyhi world_(O.o)_', 'usehi world_(O.o)_', 'breakhi world_(O.o)_', 'fixhi world_(O.o)_', 'trashhi world_(O.o)_', 'melthi world_(O.o)_']

答案 2 :(得分:0)

这可能不是最有效的方法。我首先学习Java,因此循环(或流)感觉很直观。但是,以下给出了答案。

functions = [lambda s: s + 'hi world', lambda s: s + '_(O.o)_']
inputs = ['Buy', 'use', 'break', 'fix', 'trash', 'melt']

for i, the_input in enumerate(inputs):
    for f in functions:
        the_input = f(the_input)  # keep answer between loops

    inputs[i] = the_input  # overwrite start value (could use a list and append)

print(inputs)

#['Buyhi world_(O.o)_',
# 'usehi world_(O.o)_',
# 'breakhi world_(O.o)_',
# 'fixhi world_(O.o)_',
# 'trashhi world_(O.o)_',
# 'melthi world_(O.o)_']