TypeError: Reduce() of empty sequence with no initial value

TypeError: Reduce() of empty sequence with no initial value

我目前正在尝试编写一个函数,它将给我一个元组,其索引 0 是该文件中的行数,其索引 1 是该文件中的字符数。到目前为止,我有一个元组列表,如下所示:

mapped = [(1, 50), (1, 11), (1, 58)]

我要写的行是这样的:

reduce(lambda x:(x[0]+y[0], x[1]+y[1]),(i for i in mapped))

如果它工作正常,那么它应该 return 一个 (3, 119) 的元组。但是,我收到

错误
TypeError: reduce() of empty sequence with no initial value

有人能知道这是为什么吗?

这样使用:

>>> reduce(lambda x,y:(x[0]+y[0], x[1]+y[1]),[i for i in mapped])
(3, 119)
>>> reduce(lambda x,y:(x[0]+y[0], x[1]+y[1]),(i for i in mapped))
(3, 119)

你想念的是 lambda 应该带两个参数,你只给一个。

对于Python3.x请看下面的代码:

>>> from functools import reduce
>>> reduce(lambda x:(x[0]+y[0], x[1]+y[1]),(i for i in mapped))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 1 positional argument (2 given)
>>> reduce(lambda x,y:(x[0]+y[0], x[1]+y[1]),(i for i in mapped))
(3, 119)
reduce(lambda x,y:(x[0]+y[0], x[1]+y[1]),(i for i in mapped))

这可能就是您想要的,或者至少这就是让我得到您期望的输出的原因;你必须在 lambda 表达式中添加 ,y 来告诉它会有两个参数。

map(sum, ...) 比较合身,看起来很漂亮。

map(sum, zip(*mapped))

如果列表的长度不同,您可以使用itertools.izip_longest

没有人回答为什么会出现错误: TypeError: reduce() of empty sequence with no initial value

当第二个参数的列表字面量为空时,报错。所以如果你尝试 reduce(lambda x, y:(x[0]+y[0], x[1]+y[1]), [])

您会收到错误消息。

该函数需要在列表中至少有一个元素。 试试看:

reduce(lambda x, y:(x[0]+y[0], x[1]+y[1]), [(0, 0)]+[i for i in mapped])

在 [i for i in mapped] 为空的情况下 [(0, 0)] 强制 return 至少 [(0, 0)]。