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

时间:2015-02-11 06:01:05

标签: python python-3.x tuples reduce

我正在尝试编写一个函数,它会给我一个元组,其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))

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

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

有人能弄明白为什么会这样吗?

5 个答案:

答案 0 :(得分:8)

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

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

你会收到错误。

答案 1 :(得分:5)

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

map(sum, zip(*mapped))

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

答案 2 :(得分:3)

使用这种方式:

>>> 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)

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

该功能需要在列表中至少包含一个元素。 尝试:

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

在[i代表映射中的i为空]的情况下,[[0,0)]强制返回至少[[0,0)]。