Python递归生成器
我试图创建一个递归生成器,但我显然遗漏了一些东西。基本上,对于直方图的特定维度,我有一个正负值列表,并且希望得到正负值的每个组合。 例: 我需要的结果是(虽然我想把它作为一个生成器而不是一个列表,但你明白了): 我已经成功地完成了,但只是通过在递归中向一个全局列表添加项,但我真的希望我可以用一个生成器来完成这项工作,并迭代我的函数,因为这样会使它更干净 以下是我现在拥有的:Python递归生成器,python,recursion,generator,yield,Python,Recursion,Generator,Yield,我试图创建一个递归生成器,但我显然遗漏了一些东西。基本上,对于直方图的特定维度,我有一个正负值列表,并且希望得到正负值的每个组合。 例: 我需要的结果是(虽然我想把它作为一个生成器而不是一个列表,但你明白了): 我已经成功地完成了,但只是通过在递归中向一个全局列表添加项,但我真的希望我可以用一个生成器来完成这项工作,并迭代我的函数,因为这样会使它更干净 以下是我现在拥有的: def combs(idx,array,current=[]): for item in array[idx]:
def combs(idx,array,current=[]):
for item in array[idx]:
current_copy = current[:]
current_copy.append(item)
if idx + 1 < len(array):
combs(idx+1,array,current_copy)
else:
print current_copy
# yield current_copy
如果您使用的是Python 3.3或更高版本,则需要
yield from
语句:
def combs(idx,array,current=[]):
for item in array[idx]:
current_copy = current[:]
current_copy.append(item)
if idx + 1 < len(array):
yield from combs(idx+1,array,current_copy)
else:
yield current_copy
如果您使用的是Python 3.3或更高版本,则需要
yield from
语句:
def combs(idx,array,current=[]):
for item in array[idx]:
current_copy = current[:]
current_copy.append(item)
if idx + 1 < len(array):
yield from combs(idx+1,array,current_copy)
else:
yield current_copy
此任务的另一个选项是
itertools.product
功能:
>>> from itertools import product
>>> input = [[-1,2],[-3,4],[-5,6]]
>>> list(product(*input))
[(-1, -3, -5), (-1, -3, 6), (-1, 4, -5), (-1, 4, 6), (2, -3, -5), (2, -3, 6), (2, 4, -5), (2, 4, 6)]
此任务的另一个选项是
itertools.product
功能:
>>> from itertools import product
>>> input = [[-1,2],[-3,4],[-5,6]]
>>> list(product(*input))
[(-1, -3, -5), (-1, -3, 6), (-1, 4, -5), (-1, 4, 6), (2, -3, -5), (2, -3, 6), (2, 4, -5), (2, 4, 6)]
我使用的是2.7,是否有类似的替代方案?您应该能够循环递归
combs
调用,并生成单个值我已经尝试了与上面所述完全相同的操作,除了将打印当前副本切换为生成当前副本,但我没有得到任何输出。因此,我发现它可以工作,但是我不明白为什么我需要循环递归函数调用,你能解释一下吗?调用combs
只会给你一个生成器对象,你必须循环它才能得到它的值。这与调用返回值的常规函数不同yield from
只是一种语法糖,用于消费一个iterable(如生成器)并生成值。我使用的是2.7,有类似的替代方案吗?您应该能够循环递归combs
调用,并生成单个值我已经尝试了我上面提到的方法,除了将print current\u copy切换为yield current\u copy,我没有得到任何输出。所以我知道它是有效的,但我不明白为什么需要循环递归函数调用,你能解释一下吗?调用combs
只会给你一个生成器对象,你必须循环它才能从中得到值。这与调用返回值的常规函数不同yield from
只是使用iterable(如生成器)并生成值的语法糖。这非常好,解决了手头的总体问题!我仍然很好奇为什么我试图做的事情不起作用:(如果他想让生成器做myGenerator=product(*myInput)
@Mr.E Correct,我使用了list()
来演示结果。这很好,解决了手头的整个问题!我仍然很好奇为什么我尝试做的事情不起作用:(如果他想让生成器执行myGenerator=product(*myInput)
@Mr.E Correct,我使用了list()
以演示结果。请避免使用函数名调用变量(input
在本例中)这会让您头痛请避免使用函数名调用变量(input
在本例中)这会让您头痛
def combs(idx,array,current=[]):
for item in array[idx]:
current_copy = current[:]
current_copy.append(item)
if idx + 1 < len(array):
for i in combs(idx+1,array,current_copy):
yield i
else:
yield current_copy
>>> from itertools import product
>>> input = [[-1,2],[-3,4],[-5,6]]
>>> list(product(*input))
[(-1, -3, -5), (-1, -3, 6), (-1, 4, -5), (-1, 4, 6), (2, -3, -5), (2, -3, 6), (2, 4, -5), (2, 4, 6)]