python中递归归约的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)
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