Допустим, у меня есть последовательность 0 and 1, как показано ниже.
[0,0,0,0,1,1,1,0,1,0,1,0,1,1,1]
Мы можем рассматривать эту последовательность как последовательность непрерывных 0, но прерываемых 1.
Моя цель — получить индексы, в которых последовательность непрерывных 0 прерывается 1. Поэтому в этом примере я должен получить
0, 7, 9, 11
Для последовательности ниже
[1,1,1,1,0, 0, 0, 1, 0]
Я должен получить 4, 8
Для [0,0,0,0,0,0] я должен получить 0
Для [1,1,1,1] я должен получить NULL
Есть ли какой-либо метод/функция Python для достижения этой цели напрямую?
Пожалуйста, покажите нам свою попытку.
это похоже на домашнее задание: Softwareengineering.meta.stackexchange.com/questions/6166/…






Использование numpy может быть излишним, но с ним легко выполнять такие операции:
import numpy as np
input_data = [1,1,1,1,0, 0, 0, 1, 0]
np.where(np.diff([1] + input_data + [1]) == -1)
дает желаемые результаты.
Он работает путем вычисления разницы между каждой парой последовательных чисел и возврата индексов, где есть переход 1 -> 0.
Учитывая, что ваши примеры на самом деле показывают «последовательность непрерывных 1, прерываемых 0», вот код, который подойдет вам. По сути, вы перебираете последовательность, используя enumerate, который предоставляет индекс итерации, а затем проверяете, является ли элемент по этому индексу тем, что вы ищете, и предыдущий элемент отличается.
def interrupt_indices(seq, interrupter=0):
return [i for (i, e) in enumerate(seq) if e == interrupter and (i == 0 or seq[i-1] != interrupter)]
print(interrupt_indices([0,0,0,0,1,1,1,0,1,0,1,0,1,1,1])) # [0, 7, 9, 11]
print(interrupt_indices([1,1,1,1,0, 0, 0, 1, 0])) # [4, 8]
print(interrupt_indices([0,0,0,0,0,0])) # [0]
print(interrupt_indices([1,1,1,1])) # []
print(interrupt_indices([])) # []
Вы можете заменить значение по умолчанию interrupter на 1, чтобы получить логику, которую вы изначально описали в своем сообщении.
data = [0,0,0,0,1,1,1,0,1,0,1,0,1,1,1]
find_continuous_sequence = lambda data: [i for i,v in enumerate(data) if v==0 and data[i]!=data[i-1]]
output = find_continuous_sequence(data)
Выход:
0, 7, 9, 11
Возможно, немного объяснений, почему и как это работает? Лучшие ответы содержат объяснение и код, его реализующий.
Ваши примеры, похоже, показывают «последовательность непрерывных 1, прерываемых 0», а не наоборот.