Python 如何使用enumerate重新编写dict列表的循环?
我有一张这样的口述清单:Python 如何使用enumerate重新编写dict列表的循环?,python,loops,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
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=(以前的timeseriesValue*IRR)+以前的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']
有人告诉我,有一种更像python的写作方式,使用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']
但是一旦到达循环的末尾,索引就会超出范围。如何重写原始循环?我不会使用任何索引。您要做的是:给定一个元素,根据其上一个元素的值更新其值。如果有对元素
n
和元素n+1
的引用,则可以执行此操作。在Python中,这可以通过一个iterable的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}]
你可以从1开始你的
enumerate
,然后在循环中使用i-1
。FWIW,我认为使用enumerate
并不合适,因为这本质上是一个相当递归的问题。你会建议坚持原来的for循环吗?老实说,我会完全不同地组织代码。Uff,我是这里的实习生。您将如何自己重新组织代码?似乎每个人都有自己的方式来剥猫皮。我目前正在确保代码正常工作,然后思考重新编写代码或使其更“pythonic”的最佳方式。