У меня есть два списка «начало» и «конец». Они одинаковой длины (по 4 миллиона):
for i in xrange(0,len(start)):
print start[i], end[i]
3000027 3000162
3000162 3000186
3000186 3000187
3000187 3005000
3005000 3005020
3005020 3005090
3007000 3007186
3007186 3009000
3009000 3009500
.......
Моя проблема в том, что я хочу перебрать два списка, начиная с одной и той же точки, но постепенно перебирать «конечный список», пока не найду значение, в котором разница между «start [i]» и «end [i + x ] 'больше 1000.
Я изо всех сил пытался сделать это, используя бесконечный цикл для перебора «конечного списка» до тех пор, пока разница с start не превысит 1000, а затем начну с этой точки и выполните ту же операцию оттуда ...
ПРИМЕЧАНИЕ: старое содержание опущено
В конечном итоге результат, который я ищу (взяв иллюстративный рисунок выше в качестве примера):
print density
[4, 2, 1 ...........]
Кто-нибудь может мне с этим помочь?
ОБНОВЛЕНИЕ
Хотя предыдущий ответ на этот вопрос действительно работает:
density=[]
i_s = 0
while i_s < len(start):
i_e = i_s
while i_e < len(end):
if end[i_e] - start[i_s] > 1000:
density.append(i_e - i_s + 1)
i_s = i_e
break
i_e += 1
i_s += 1
print sum(density)/float(len(density))
print max(density)
print min(density)
Я боюсь, что код работает очень медленно, поскольку я обновляю расширение i_e, добавляя к нему 1 с каждой итерацией внутреннего цикла while ... Чтобы решить эту проблему, я хотел создать переменную счетчика, которая будет расширять переменная i_e динамически. Это будет сделано с помощью рекурсии, при которой переменная i_e будет увеличиваться экспоненциально до точки, где будет достигнута половина желаемого расстояния, а затем будет экспоненциально уменьшаться, пока не будет достигнуто желаемое расстояние.
Иллюстрация стратегии
Моя попытка такова:
Я создал рекурсивную функцию для обновления счетчика переменной
counter=1 ##### initialise counter with value of 1
def exponentially_increase_decrease(start, end, counter):
distance=end-start
if distance<=500: ###500 is half the desired distance
counter=exponentially_increase_decrease(start, end, counter*2)
else:
counter=-exponentially_increase_decrease(start, end, counter/2)
print counter
return counter
Вызов функции в исходном коде:
density=[]
i_s = 0
while i_s < len(start):
i_e = i_s
while i_e < len(end):
if end[i_e] - start[i_s] > 1000:
density.append(i_e - i_s + 1)
i_s = i_e
break
counter=counter=exponentially_increase_decrease(i_s, i_e, counter)
i_e += counter
i_s += 1
Я получаю следующую ошибку:
(Напечатано тысячи раз)
counter=exponentially_increase_decrease(start, end, counter*2)
RuntimeError: maximum recursion depth exceeded
Я не сталкивался с подобными проблемами и не уверен, правильно ли я подхожу к ним ... может ли кто-нибудь помочь?
4005090
в конечном списке по сравнению с300500
в начальном списке справа на 1 позицию позади соответствует условию? - person dabadaba   schedule 14.09.2017end
начинаться с текущего индекса вstart
? Другими словами, нужно лиcounter
равнятьсяi
каждый раз, когда вы запускаете внутренний цикл while? - person RagingRoosevelt   schedule 14.09.20172
в вашем примере изображения действительно быть3
? - person RagingRoosevelt   schedule 14.09.2017