Разрыв цикла, если появляется последовательность чисел

#python #for-loop #if-statement #break

Вопрос:

У меня проблемы с циклами. У меня есть простой цикл for, который добавляет случайные числа , мне нужно, чтобы, если число появляется несколько раз подряд for loop , это был пример.

 import numpy as np

stop = 3
value = []
for i in range(100):
    value.append(np.random.randint(0, 2))
    print(value)
    if value[-stop:] == [0]*stop or value[-stop:] == [1]*stop:
        break
 

Что делает этот код, я хочу сделать for loop 100 times , но если число 0 или число 1 появляются 3 раза подряд в конце списка, а затем прерывается цикл, как я могу обобщить на любое случайное число без необходимости добавлять бесконечность or для каждого случайного значения. Я попытался использовать другой цикл for для повторения каждого значения в добавленном списке, но это не работает, он продолжает добавлять случайные числа, даже если условие достигнуто:

 stop = 3
value = []
for i in range(15):
    value.append(np.random.randint(0, 3))
    print(value)
    for i in value:
        if value[-stop:] == [i]*stop: 
            break
 
 This is what I get in the 10th iteration, here it should stop, since 0 appears three times:
[0, 1, 0, 1, 1, 2, 0, 2, 0, 0, 0]

But it keeps doings iterations and the next one is
[0, 1, 0, 1, 1, 2, 0, 2, 0, 0, 0, 2]

 

Любая идея была бы признательна, если что-то не ясно, пожалуйста, дайте мне знать, и я отредактирую вопрос. Еще раз спасибо вам!

Комментарии:

1. [i]*stop не будет работать, например, в цикле, когда i=10 , тогда [i]*stop даст [10,10,10] за stop=3

Ответ №1:

Проверьте, все ли значения соответствуют первому из группы:

 if all(value[pos] == value[-1] for pos in range(-stop, -2)):
 

Вы проверяете последний элемент, value[-1] , по сравнению с предыдущими от позиции -stop до -2 .

Посмотрите функции any и all ; они очень полезны для таких вещей.

Комментарии:

1. Или можно использовать np.where вместе со всеми для последних нескольких значений, упомянутых как stop. Верно?

Ответ №2:

Итак, я понял ваш вопрос и пришел к такому ответу. Дай мне знать, если у тебя все получится.

 import numpy as np

stop = 3
value = []
for i in range(15):
    value.append(np.random.randint(0, 3))
    print(value)
    
    if len(value)<stop:
        continue

    if all(np.where(np.array(value[-stop:])==value[-1], True, False)):
        break
 

Для одного из случайных запусков я получил это в качестве вывода:

 [1]
[1, 2]
[1, 2, 0]
[1, 2, 0, 1]
[1, 2, 0, 1, 1]
[1, 2, 0, 1, 1, 1]
 

Дайте мне знать, если это сработает для вас или если вы захотите внести какие-либо другие изменения.