python中递归归约的python方法

python中递归归约的python方法,python,reduce,Python,Reduce,在python中减少列表时,我考虑过创建一个多列表减少,并编写了以下代码段 def multiply(a, b): return a * b def recursive_reduce(reduce_func, *args): ret_val = reduce(reduce_func, *args) if type(ret_val) == list: ret_val = recursive_reduce(reduce_func, ret_val)

在python中减少列表时,我考虑过创建一个多列表减少,并编写了以下代码段

def multiply(a, b): return a * b

def recursive_reduce(reduce_func, *args):
     ret_val = reduce(reduce_func, *args)
     if type(ret_val) == list:
         ret_val = recursive_reduce(reduce_func, ret_val)
     return ret_val

a = [1, 1, 3]
b = [4, 5, 6]

recursive_reduce(multiply, a, b)
这很有效。然而,我想知道基于返回值类型定义迭代逻辑是否是pythonic的


我们还有其他更优雅的方法来实现递归归约吗?

我想你要做的是做一个递归版本的归约

def rreduce(f, init, default=None):                     
    if default is None:
        default = init[0]
        init = init[1:]
    if len(init) == 0:
         return default
    return rreduce(f, init[1:], f(default, init[0]))


>>> rreduce(lambda a, b: a*b, range(1,10))
362880
>>> rreduce(lambda a, b: a+b, ['t', 'a', 'c', 'o'])
'taco'
虽然递归很好,但在Python中,这不是
reduce
类型函数的首选方法,因为它速度慢,并且会出现堆栈溢出(HAA)

减少
列表

>>> lreduce(lambda a, b: a + b, [range(10), range(10), range(10)])
[45, 45, 45]
之所以需要使用
if/else
,是因为
reduce
作为
内置的
不接受关键字参数:

In [56]: reduce(function=lambda a, b: a + b, sequence=range(10), initial=0)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-9fa3ed177831> in <module>()
----> 1 reduce(function=lambda a, b: a + b, sequence=range(10), initial=0)

TypeError: reduce() takes no keyword arguments
最后:

>>> lreduceall(lambda a, b: a + b, [range(10), range(10), range(10)])
135

这是蟒蛇吗?函数第一行的
reduce
是什么<代码>functools.reduce
?是的,这是python2代码。reduce函数不需要任何导入即可使用。这绝对不是肾盂。这甚至不明智。reduce函数返回一个值。只有当
reduce\u func
以某种方式将两个列表合并为一个列表时,才会使用if语句。但是您可以使用三个参数(一个函数和两个列表)从main调用递归_reduce。递归调用只有两个参数,一个函数和一个列表。那么,同一个函数应该如何处理两种情况呢?为什么需要多次调用约简函数?为什么它不总是减少它所调用的iterable的维数?从我的观点来看,您的归约函数似乎有问题,您应该修复它,而不是从递归函数调用它。@PaulCornelius,在上面的示例中,if语句的计算结果为True。关于这不是python的方式,may是,这就是为什么我问这个问题,并想了解更多关于它的信息。我回答了一个关于堆栈溢出的问题。这是我一生中最伟大的一天。谢谢。我现在已经从你的想法中明白了。我将尝试这种方法。太好了!别忘了把它标为公认的答案,这样你将来就能帮助别人了!
In [56]: reduce(function=lambda a, b: a + b, sequence=range(10), initial=0)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-9fa3ed177831> in <module>()
----> 1 reduce(function=lambda a, b: a + b, sequence=range(10), initial=0)

TypeError: reduce() takes no keyword arguments
def lreduceall(f, init, default=None):
    if default is None:
        return reduce(f, reduce(lambda x, a: x + [reduce(f, a)], init, []))
    else:
        return reduce(f, reduce(lambda x, a: x + [reduce(f, a, default)], init, []), default)
>>> lreduceall(lambda a, b: a + b, [range(10), range(10), range(10)])
135