Значение не появляется после определенного диапазона в Python - PullRequest
0 голосов
/ 30 августа 2018

У меня есть код, предназначенный для обновления значения 'time' для каждого из 5 элементов. Однако когда значение достигает 15, значение после него не учитывается. Это код:

def get_new_theta(msg, theta, time):
    new_theta = [theta]
    new_time = [time]
    for a, b in zip(msg[3::5], msg[4::5]):
        new_theta.append(new_theta[-1] + a + b)
        new_time.append(new_time[-1]+time)
    return new_theta[:-1], new_time[:-1]

msg = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
theta = 1
time = 4.5

for i, (theta, time) in enumerate( zip(*get_new_theta(msg, theta, time)) ):
    for j in range(5):
        print(theta, msg[i*5+j], time)

Вывод должен быть таким:

1 1 4.5
1 2 4.5
1 3 4.5
1 4 4.5
1 5 4.5
10 6 9.0
10 7 9.0
10 8 9.0
10 9 9.0
10 10 9.0
29 11 13.5
29 12 13.5
29 13 13.5
29 14 13.5
29 15 13.5
58 16 18 <-- the values after 15 do not print
58 17 18

Нужна помощь с этого форума. Спасибо.

1 Ответ

0 голосов
/ 30 августа 2018

Проблема в том, что ваши циклы не заходят так далеко. Обратите внимание, что new_theta содержит 4 значения, и вы возвращаете 3 из них. Ваш внешний цикл for i, (theta, time) ... выполняется 3 раза, внутренний цикл for j in range(5)... выполняется 5 раз для каждого из этих 3 раз в общей сложности 15 итераций. Вот почему последний напечатанный номер 15.

В этом случае исправление не совсем очевидно и зависит от того, что вы хотите сделать. Следующее, по крайней мере, проходит через все 18 значений без ошибок, изменив внешний цикл для запуска 4 раза и изменив внутренний цикл для выхода при 19-м запуске (поскольку у вас нет 5 полных сообщений для итерации).

def get_new_theta(msg, theta, time):
    new_theta = [theta]
    new_time = [time]
    for a, b in zip(msg[3::5], msg[4::5]):
        new_theta.append(new_theta[-1] + a + b)
        new_time.append(new_time[-1]+time)
    return new_theta, new_time

msg = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
theta = 1
time = 4.5

for i, (theta, time) in enumerate( zip(*get_new_theta(msg, theta, time)) ):
    for j in range(5):
        if i*5+j >= len(msg):
            break
        print(theta, msg[i*5+j], time)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...