我需要迭代 n (= 5, f.i.) 个整数的升序序列 x,找到函数 f(*x) 返回 True 的所有序列。
假设如果 f_n(*y) 对于特定的 y 为假,那么对于任何 z 且 z_i >= y_i 的 f_n(*z) id 为假。所以 f_n 在其所有参数中都是单调的。
这种生成器函数可以用下面的方式来确定所有平方和<100的整数递增序列
for sequence in generate_sequences(5):
if sum_squares_is_at_least(sequence, 100):
# some code to trigger the breaking of the generator loop
else:
print sequence
澄清: 这里的问题是我们需要单独迭代 n 个元素。最初,我们将 [1,1,1,1,1] 迭代到 [1,1,1,1,x],然后我们必须继续 [1,1,1,2,2] 到 [1, 1,1,2,y],最终以 [a,b,c,d,e] 结尾。看起来生成器应该看起来像这样,但需要一些代码来在必要时跳出 for 和/或 while 循环(由外部确定):
def generate_sequences(length, minimum = 1):
if length == []:
yield []
else:
element = minimum
while True:
for sequence in generate_sequences(length - 1, element):
yield element + [sequence]
element += 1
例子: 对于 n = 3,且平方和不大于 20,将生成以下序列: [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 2, 2], [1, 2, 3], [1 , 3, 3], [2, 2, 2], [2, 2, 3]
请注意,在一般情况下,我不能使用 4 是每个元素的上限的信息。这也会严重影响更大示例的运行时间。
最佳答案
你在找itertools.takewhile吗?
>>> from itertools import takewhile
>>> def gen(): #infinite generator
... i=0
... while True:
... yield range(i,i+5)
... i = i+1
...
>>> [ x for x in takewhile( lambda x:sum(x)<20, gen() ) ]
[[0, 1, 2, 3, 4], [1, 2, 3, 4, 5]]
>>>
关于具有外部中断条件的 Python 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14981704/