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)]。
我目前正在尝试编写一个函数,它将给我一个元组,其索引 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)]。