【发布时间】:2020-12-17 13:27:34
【问题描述】:
我已经编写了一个函数来创建任意长度的输入组合,因此递归似乎是显而易见的方法。虽然一个小玩具示例返回结果列表是可以的,但我想代替它们。我读过yield from,但不完全理解它是如何使用的,这些示例似乎没有涵盖我的用例,并且希望将它插入我的代码还没有产生任何有效的东西。请注意,编写此递归代码是我 Python 能力的极限,因此需要大量调试打印语句。
这是工作列表返回代码,我希望的非工作收益已被注释掉。
def allposs(elements, output_length):
"""
return all zero insertion paddings of elements up to output_length maintaining order
elements - an iterable of length >= 1
output_length >= len(elements)
for instance allposs((3,1), 4) returns
[[3,1,0,0], [3,0,1,0], [3,0,0,1], [0,3,1,0], [0,3,0,1], [0,0,3,1]]
"""
output_list = []
def place_nth_element(nth, start_at, output_so_far):
# print('entering place_nth_element with nth =', nth,
# ', start_at =', start_at,
# ', output_so_far =', output_so_far)
last_pos = output_length - len(elements) + nth
# print('iterating over range',start_at, 'to', last_pos+1)
for pos in range(start_at, last_pos+1):
output = list(output_so_far)
# print('placing', elements[nth], 'at position', pos)
output[pos] = elements[nth]
if nth == len(elements)-1:
# print('appending output', output)
output_list.append(output)
# yield output
else:
# print('making recursive call')
place_nth_element(nth+1, pos+1, output)
place_nth_element(0, 0, [0]*output_length)
return output_list
if __name__=='__main__':
for q in allposs((3,1), 4):
print(q)
使用yield from 让我的列表一次生成一个组合的语法是什么?
【问题讨论】:
-
在您的函数中,您对 place_nth_element 进行了递归调用,但随后您丢弃了它返回的任何结果。您通常需要
yield from place_nth_element()以便此调用返回递归调用返回的任何内容。 -
@FrankYellin 我认为这是我遇到困难的地方,递归调用不返回任何内容,它附加到顶层列表