L oop по списку и приращение со значениями в словарь - PullRequest
2 голосов
/ 11 января 2020

У меня есть список этого формата:

some_list = [[-5, 1000], 
           [0, 600], 
           [50, 600],
           [100,700],
           [170,650],
           [190,700]]

, и возвращаемая функция должна быть результирующим диктом с ключами -5, -4, -3 ... и со значениями в виде суммы приращений до каждого ключа. так, например, выше должно быть -5: 0, -4: 1000, -3: 2000, -1: 3000, 0: 4000, 1: 4600 и далее.

Вот код, который частично работает. Проблема в том, что в то время как в операторе while требуется потолок для проверки, я добавил дополнительные элементы в конец списка. Предположим, это можно решить гораздо более элегантным способом. Также текущий код исключает последнюю строку элемента списка из-за оператора break.

def framegen(some_list):
    n = 0
    ys = some_list[0][0] 
    frame = []
    xpos = []
    x2 = 0
    for i in some_list:
        while (some_list[n][0]) <= ys < (some_list[(n+1)][0]):
            x1 = ys
            frame.append(x1)
            xpos.append(x2)
            x2 += some_list[n][1]                 
            ys += 1                
            if n == len(some_list) -2 :
                break
        else:
            n += 1        
    temp_dic = dict(zip(frame, xpos))
    dic = {}
    for n in temp_dic:
        dic[n] = temp_dic[n] - temp_dic[0]
    return dic

Редактировать:

ожидаемый результат:

   { -5 : 0 , 
-4 : 1000 , 
-3 : 2000 , 
-2 : 3000 , 
-1 : 4000 , 
0 : 5000 , 
1 : 5600 , 
2 : 6200 ,
....}

1 Ответ

1 голос
/ 21 января 2020

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

Код:

some_list = [[-5, 1000], 
           [0, 600], 
           [50, 600],
           [100,700],
           [170,650],
           [190,700]]

d = dict()

for s, e in zip(some_list[:-1], some_list[1:]):
    for k in range(s[0], e[0] + 1):
        if k not in d:
            d[k] = d.get(k-1, -s[1]) + s[1]

Выход

>>> d
{-5: 0,
 -4: 1000,
 -3: 2000,
 -2: 3000,
 -1: 4000,
 0: 5000,
 1: 5600,
 2: 6200,
 3: 6800,
 4: 7400,
 ...
 181: 121150,
 182: 121800,
 183: 122450,
 184: 123100,
 185: 123750,
 186: 124400,
 187: 125050,
 188: 125700,
 189: 126350,
 190: 127000}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...