如何保持累计金额?

时间:2017-05-01 10:19:35

标签: python cumulative-sum sorteddictionary

我有一个sorteddict,我对这些值的累积总和感兴趣:

>>> from blist import sorteddict
>>> import numpy as np
>>> x = sorteddict({1:1, 2:2, 5:5})
>>> zip(x.keys(), np.cumsum(x.values())) 
[(1, 1), (2, 3), (5, 8)]

但是,我经常需要更新字典,因此需要重新计算累积总和:

>>> x[4] = 4
>>> zip(x.keys(), np.cumsum(x.values()))
[(1, 1), (2, 3), (4, 7), (5, 12)]

>>> x[3] = 3
>>> zip(x.keys(), np.cumsum(x.values()))
[(1, 1), (2, 3), (3, 6), (4, 10), (5, 15)]

我想知道是否有一些聪明的方法可以有效地维持累积金额,而不是不断地重新计算累积金额?

注意

>>> import sys
>>> sys.version
'2.7.11 (default, Jun 15 2016, 17:53:20) [MSC v.1800 32 bit (Intel)]'

一般来说,我的键和值也不一样 - 我的例子中只是懒惰

1 个答案:

答案 0 :(得分:0)

如何?

import collections

def add_and_regenerate_sums(term, master):
    index, value = term
    master[index] = value
    master = collections.OrderedDict(sorted(master.items(), key=lambda z: z[0]))
    y = dict()
    sum_of = 0
    for i, j in master.items():
        sum_of += j
        y[i] = sum_of

    return dict(sorted(y.items(), key=lambda z: z[0])), master

x = collections.OrderedDict({1:1, 2:2, 5:5})

sums, master = add_and_regenerate_sums((3, 10), x)
print(sums)
print(master)

然后,您可以根据加法以及稍后要使用的新字典来获得总和。