具有外部中断条件的 Python 生成器

标签 python generator

我需要迭代 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/

相关文章:

python - 比较字符串并确定它们是否与隐藏值相同

java - 如何使图形随机出现并在与另一个图形碰撞时消失?

java - 如何使用 docx4j 将图像相关添加到我的 pptx 幻灯片

python - 带有列表生成器的 numpy fromiter

python - Dict - 如果每个键有多个值,则提取最后一个元素

python - Python OpenCV检测棋盘

python - 导入 pygame 时,在 VScode 中为 pylint 导入失败

python - eval 在评估生成器时未能检测到迭代变量

javascript - 如何从yield *返回

python - SQLAlchemy:过滤多对多但返回所有结果