2016-12-11 2 views
0

Учитывая список входов. Последний х списка - это число, которое я хочу использовать для теста. Итак, начальные n-x-элементы - это те, которые я хочу проверить, используя элементы в x.Пока цикл не выходит из Python

Например:

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. Я печатаю заявления, и похоже, что это просто продолжается.

Есть ли более простой способ использования фильтра?

+0

Ваше условие цикла зависит от len (x), но вы добавляете один элемент в x каждой итерации через цикл, поэтому len (x) продолжает увеличиваться. – jarmod

+0

Вот и все, спасибо! – WhitneyChia

ответ

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) кортежей.

0

Цикл не останавливается, так как len(x) оценивается на каждой итерации. В вашем цикле вы увеличиваете count_pos и добавляете новый элемент к x.

+0

Спасибо ... глупая ошибка. – WhitneyChia

Смежные вопросы