使用 lambda 重定向对象列表以减少函数时出错
An error when redirecting a list of objects to reduce function with lambda
这是简单的代码。
class C:
def __init__(self):
self.l = [1,2,3]
a = C()
b = C()
c = C()
reduce(lambda x,y: x.l + y.l, [a,b,c])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'list' object has no attribute 'l'
我知道还有其他几种方法。但我想看看为什么这不起作用。
输出应该与
给出的相同
sum([x.l for x in [a,b,c]], [])
这是
[1, 2, 3, 1, 2, 3, 1, 2, 3]
作为第一个参数传递给 reduce 的函数有 2 个参数,第一个是先前归约的结果(如果没有给出初始值,则为 iterable 中的第一项)。在您的情况下,在将前两个列表加在一起后 x
现在是一个列表,当传递给 lambda 进行第二次迭代时并且没有属性 l
因为它不是的实例C
如果你 运行 你的列表通过 map 你可以从所有对象中提取列表并将它们传递给 reduce
reduce(lambda x, y: x + y, map(lambda z: z.l, [a,b,c]))
正如 Iain 在他的回答中所说的那样,问题在第一个术语被评估后出现,因为您的类型停止匹配。
Reduce 的形式为:reduce(f(B,A)->B, [A], optional B) -> B
您提供了一个签名为 f(C, C) -> [int]
的函数
reduce(lambda x,y: x.l + y.l, [a,b,c])
与 f(B,A)->B
不匹配。您可以通过两种方式清楚地解决这个问题,通过更改第一个参数 (1) 或 return (2)
(1) f(int, C) -> int
。其中 A 是 C,B 是 [int].
reduce(lambda x, y: x + y.l, [a, b, c], [])
(2) f(C, C) --> C
。其中 A 是 C,B 也是 C。
def add_c(c1, c2):
ret = C()
ret.l = c1.l + c2.l
return ret
reduce(add_c, [a, b, c]).l
请注意 .l
以提取您的列表
请注意,第二个只是丑陋的,因为您的 class 非常愚蠢,并且没有初始化。小写的 L 作为变量也是不幸的。
这是简单的代码。
class C:
def __init__(self):
self.l = [1,2,3]
a = C()
b = C()
c = C()
reduce(lambda x,y: x.l + y.l, [a,b,c])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'list' object has no attribute 'l'
我知道还有其他几种方法。但我想看看为什么这不起作用。
输出应该与
给出的相同sum([x.l for x in [a,b,c]], [])
这是
[1, 2, 3, 1, 2, 3, 1, 2, 3]
作为第一个参数传递给 reduce 的函数有 2 个参数,第一个是先前归约的结果(如果没有给出初始值,则为 iterable 中的第一项)。在您的情况下,在将前两个列表加在一起后 x
现在是一个列表,当传递给 lambda 进行第二次迭代时并且没有属性 l
因为它不是的实例C
如果你 运行 你的列表通过 map 你可以从所有对象中提取列表并将它们传递给 reduce
reduce(lambda x, y: x + y, map(lambda z: z.l, [a,b,c]))
正如 Iain 在他的回答中所说的那样,问题在第一个术语被评估后出现,因为您的类型停止匹配。
Reduce 的形式为:reduce(f(B,A)->B, [A], optional B) -> B
您提供了一个签名为 f(C, C) -> [int]
reduce(lambda x,y: x.l + y.l, [a,b,c])
与 f(B,A)->B
不匹配。您可以通过两种方式清楚地解决这个问题,通过更改第一个参数 (1) 或 return (2)
(1) f(int, C) -> int
。其中 A 是 C,B 是 [int].
reduce(lambda x, y: x + y.l, [a, b, c], [])
(2) f(C, C) --> C
。其中 A 是 C,B 也是 C。
def add_c(c1, c2):
ret = C()
ret.l = c1.l + c2.l
return ret
reduce(add_c, [a, b, c]).l
请注意 .l
以提取您的列表
请注意,第二个只是丑陋的,因为您的 class 非常愚蠢,并且没有初始化。小写的 L 作为变量也是不幸的。