Я дам вам два возможных подхода к этой проблеме.Первый быстрее, но требует немного больше кода.Второй медленнее, но короче.
function getblocks1(vs)
blocks = Tuple{Int, Int}[]
inblock, start = false, 0, 0
for (i, v) in enumerate(vs)
if inblock
if v >= 1.0
push!(blocks, (start, i-1))
inblock = false
end
else
if v < 1.0
start = i
inblock = true
end
end
end
inblock && push!(blocks, (start, length(vs)))
blocks
end
function getblocks2(vs)
t = [false; vs .< 1.0; false]
dt = diff(t)
f = findall(==(1), dt)
l = findall(==(-1), dt) .- 1
collect(zip(f, l))
end
Важно знать, что в Julia getblocks1
будет быстрым, потому что циклы в Julia быстрые, а функция пытается минимизировать количество распределений и выполняетвсе за один проход.Вторая реализация более похожа на Python, но выделяет больше и делает несколько проходов через весь вектор.