虽然循环没有退出Python

时间:2016-12-11 22:37:26

标签: python while-loop

给出一个输入列表。列表的最后一个x是我想要用于测试的数字。因此,开始的n-x元素是我想要使用x中的元素进行测试的。

例如:

test_case = [0.18677649597722776, 0.21992417009282958, 0.21001370207789635, 0.2576939078119566, -0.26790678064174844, 0.23723906040549575, 0.23796810219833633, 0.12311570730540798, 0.291222989748139, -0.46589179980005796, -0.5679935337540711, -0.541967302717414, 0.2797199715268191, -0.0462338707795437, 0.3352382038488532, -0.6395453091791992, -0.7116194799285872, -0.6827853559995019, 0.4131897184013285, 0.07125041194386302, 0.47179441094288416, -0.5670171363969451, -0.6493889334859158, -0.6214861349381114, 0.6332084272531783, 0.2946607775328391, 0.7252115985158697, -0.48494480580385074, -0.5584250339723696, -0.5329318548632481, 0, 1, 0, 5, 5, 5]

最后6个数字我想用作前30个数字测试的一部分。我希望循环显示30个数字,以便在test_case[31] < 3时,给我test_case[0],否则请给我-999。这将迭代到test_case[36] < 3,给我test_case[5]。然后我希望test_case[31]返回并在test_case[6]上使用并再次循环。

test_case[30]之后,我希望它停止。

这就是我所拥有的:

def test_inputs(x, comp_size):
    counts = x[-comp_size:]
    inputs = x[:(len(x)-comp_size+1)]
    counts_pos = 0
    inputs_pos = 0
    while inputs_pos < (len(x)-comp_size+1):
        if counts_pos == 6:
            counts_pos = 0
        if counts[counts_pos] < 3:
            x.append(inputs[inputs_pos])
            print inputs_pos
            print counts_pos
            inputs_pos += 1
            counts_pos += 1
        else:
            x.append(-999)
            print inputs_pos
            print counts_pos
            inputs_pos += 1
            counts_pos += 1

我正在尝试制作一个通用函数。在这种情况下,应该能够运行:

test_inputs(test_case, 6)

但是,这不会停留在inputs_pos == 31。我输入了印刷语句,看起来它一直在继续。

使用过滤器有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

我是否理解你想要的:

from itertools import cycle
def test_inputs(x, comp_size):
    return [(input if count<3 else -999) for (input,count)
            in zip(x[:-comp_size], cycle(x[-comp_size:]))]

您可以使用x.extend代替return恢复就地修改行为。由于切片是在扩展调用之前执行的,因此它将生成完全相同的项。尽管如此,我并不认为将数据类型混合在一个列表中通常是个好主意,因为这样可以很容易地传递(inputs,counts)个元组。

答案 1 :(得分:0)

循环不会停止,因为在每次迭代时都会计算len(x)。在您的周期中,您可以增加count_pos并将新元素附加到x