首页 > 解决方案 > 添加具有函数而不是数字的二维列表的项目

问题描述

我正在尝试解决一个需要将不同功能放入 2D 列表的问题。我已经准备好 2D 列表,在工作的最后阶段,我需要将所有函数添加到不同的行中以得到最终函数。一旦我想添加我的列表中的不同项目(它们是函数)。

我收到一个类型错误:

TypeError: unsupported operand type(s) for +: 'function' and 'function'.

有没有办法在这种情况下添加列表项?

这是我的代码的简化版本,用于复制错误:

A = [([0] * 2) for row in range(2)]

A[0][0] = lambda x: x
A[0][1] = lambda x: x + 1
A[1][0] = lambda x: x + 2
A[1][1] = lambda x: x + 3

test = A[0][0] + A[0][1]

print(test(1))

标签: pythonfunctionlambda

解决方案


定义test为一个新的lambda

A = [([0] * 2) for row in range(2)]

A[0][0] = lambda x: x
A[0][1] = lambda x: x + 1
A[1][0] = lambda x: x + 2
A[1][1] = lambda x: x + 3

test = lambda x: A[0][0](x) + A[0][1](x)

print(test(1))
# 3

如果你连续有两个以上的元素,这可能很乏味,所以使用functools.reduce

from functools import reduce

test_red = reduce(lambda x, y: lambda z: x(z) + y(z), A[0])
print(test_red(1))
# 3

所以最后,为每一行生成简化的函数:

from functools import reduce

test_all = [reduce(lambda x, y: lambda z: x(z) + y(z), a) for a in A]
print(test_all[0](1))
# 3
print(test_all[1](1))
# 7

推荐阅读