我正在尝试编写一个函数,它会给我一个元组,其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
有人能弄明白为什么会这样吗?
答案 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)
答案 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)]。