如何使用枚举重写一个dicts列表的循环?

时间:2018-06-11 15:59:56

标签: python loops

我有一个像这样的词典列表:

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

有更多的pythonic写法

我试过了:

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']

但是一旦到达循环结束,索引就会超出范围。我怎样才能重写原始循环?

1 个答案:

答案 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}]