我有一个像这样的词典列表:
hashed_data = [
{'EffectiveDate': '1981-03-90', 'TimeSeriesValue': 100, 'IRR': 0.34},
{'EffectiveDate': '1981-04-90', 'TimeSeriesValue': None, 'IRR': 0.84},
{'EffectiveDate': '1981-05-90', 'TimeSeriesValue': None, 'IRR': 0.54},
{'EffectiveDate': '1981-06-90', 'TimeSeriesValue': None, 'IRR': 0.31}
]
我写了一个计算TimeSeriesValue
的方法,公式如下:
timeseriesValue = (previous timeseriesValue * IRR) + pervious timeseriesValue
for index in (0, len(hashed_data) - 1):
hashed_data[index + 1]['TimeSeriesValue'] = \
(hashed_data[index + 1]['IRR'] * hashed_data[index]['TimeSeriesValue']) + \
hashed_data[index]['TimeSeriesValue']
有人告诉我,使用enumerate
我试过了:
for i, item in enumerate(hashed_data):
hashed_data[i+1]['TimeSeriesValue'] = (hashed_data[i+1]['IRR'] * hashed_data[i]['TimeSeriesValue']) + hashed_data[i]['TimeSeriesValue']
但是一旦到达循环结束,索引就会超出范围。我怎样才能重写原始循环?
答案 0 :(得分:1)
我不会使用任何指数。你想要做的是:给定一个元素,根据其前一个元素的值更新其值。如果您对元素n
和元素n+1
有引用,则可以执行此操作。在Python中,这可以通过zip
的可迭代实现,并且本身可以移位:
>>> hashed_data = [
... {'EffectiveDate': '1981-03-90', 'TimeSeriesValue': 100, 'IRR': 0.34},
... {'EffectiveDate': '1981-04-90', 'TimeSeriesValue': None, 'IRR': 0.84},
... {'EffectiveDate': '1981-05-90', 'TimeSeriesValue': None, 'IRR': 0.54},
... {'EffectiveDate': '1981-06-90', 'TimeSeriesValue': None, 'IRR': 0.31}
... ]
>>>
>>> for e_prev, e in zip(hashed_data, hashed_data[1:]):
... e['TimeSeriesValue'] = ( e_prev['TimeSeriesValue'] * e_prev['IRR'] ) + e_prev['TimeSeriesValue']
...
>>> hashed_data
[{'EffectiveDate': '1981-03-90', 'TimeSeriesValue': 100, 'IRR': 0.34}, {'EffectiveDate': '1981-04-90', 'TimeSeriesValue': 134.0, 'IRR': 0.84}, {'EffectiveDate': '1981-05-90', 'TimeSeriesValue': 246.56, 'IRR': 0.54}, {'EffectiveDate': '1981-06-90', 'TimeSeriesValue': 379.7024, 'IRR': 0.31}]