TypeError:没有初始值的空序列的Reduce()

Tyl*_*ler 3 python reduce tuples python-3.x

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

mapped = [(1, 50), (1, 11), (1, 58)]
Run Code Online (Sandbox Code Playgroud)

我想写的这句话是这样的:

reduce(lambda x:(x[0]+y[0], x[1]+y[1]),(i for i in mapped))
Run Code Online (Sandbox Code Playgroud)

如果它正常工作,那么它应该返回(3,119)的元组.但是,我收到了错误

TypeError: reduce() of empty sequence with no initial value
Run Code Online (Sandbox Code Playgroud)

任何人都可以弄清楚为什么会这样吗?

Jac*_*CUI 10

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

当作为第二个参数的列表文字为空时,会发生错误.所以,如果你尝试 reduce(lambda x, y:(x[0]+y[0], x[1]+y[1]), [])

你会得到错误.


ozg*_*gur 6

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

map(sum, zip(*mapped))
Run Code Online (Sandbox Code Playgroud)

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


lqh*_*gbl 4

使用这种方式:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

你错过的是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)
Run Code Online (Sandbox Code Playgroud)