我正在尝试查找列表的长度。这两个折叠为什么只是因为缺少初始值而返回不同的结果呢?
In [77]: reduce(lambda acc, x: acc + 1, [x for x in range(8)])
Out[77]: 7
In [78]: reduce(lambda acc, x: acc + 1, [x for x in range(8)], 0)
Out[78]: 8
但似乎我需要通过初始值才能正常工作。为什么?
我正在尝试查找列表的长度。这两个折叠为什么只是因为缺少初始值而返回不同的结果呢?
In [77]: reduce(lambda acc, x: acc + 1, [x for x in range(8)])
Out[77]: 7
In [78]: reduce(lambda acc, x: acc + 1, [x for x in range(8)], 0)
Out[78]: 8
但似乎我需要通过初始值才能正常工作。为什么?
如果您没有传递起始值,则列表的第一个值将用作起始值,并且从未将您的lambda函数的参数作为x
传递,因此实际上得到的结果为my_list[0] + len(my_list) - 1
。
我已经证实,这在Haskell中表现相同。 – canadadry
第一个以第一个元素(0)开始,并为其他七个元素加1。第二个以0开始,并为八个元素中的每一个添加1。
是不是有一个原因,你正在玩这个而不是仅仅使用'len'? –