Я хочу улучшить скорость моего алгоритма с вводом нескольких строк. Python. Найдите среднее число последовательных элементов в списке - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно найти среднее число последовательных элементов из списка. Сначала мне дается длина списка,

, затем список с числами,

, затем мне дается, сколько тестов мне нужно выполнить (несколько строк с входами),

, затем Мне дано несколько входных данных для выполнения тестов (и мне нужно напечатать столько строк с результатами)

каждая строка для теста состоит из начального и конечного элементов в списке.

My algorithm:
nu = int(input())              # At first I am given lenght of list
numbers = input().split()      # then list with numbers
num = input()                  # number of rows with inputs
k =[float(i) for i in numbers] # given that numbers in list are of float type
i= 0
while i < int(num):
 a,b = input().split()          # start and end element in list
 i += 1
 print(round(sum(k[int(a):(int(b)+1)])/(-int(a)+int(b)+1),6)) # round up to 6 decimals

Но это не Мне сказали, что лучше избавиться от «пока», но я не знаю как. Благодарю за любую помощь.

Example:
Input:
8 - len(list)
79.02 36.68 79.83 76.00 95.48 48.84 49.95 91.91 - list
10 - number of test
0 0 - a1,b1
0 1
0 2
0 3
0 4
0 5
0 6
0 7
1 7
2 7
Output:
79.020000
57.850000
65.176667
67.882500
73.402000
69.308333
66.542857
69.713750
68.384286
73.668333

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы не указали ограничения, но я предполагаю, что диапазоны для усреднения могут быть довольно большими. Вычисление sum(k[int(a):(int(b)+1)]) может занять некоторое время.

Однако, если вы предварительно вычислите частичные суммы входного списка, на каждый запрос можно будет ответить за постоянное время (сумма чисел в диапазоне - это разность соответствующих частичных сумм ).

0 голосов
/ 06 мая 2020
i= 0
while i < int(num):
     a,b = input().split()          # start and end element in list
     i += 1

Замените while-l oop на l oop. Также вы можете избавиться от нескольких вызовов int в операторе печати:

for _ in range(int(num)):
    a, b = [int(j) for j in input().split()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...