Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用enumerate重新编写dict列表的循环?_Python_Loops - Fatal编程技术网

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”的最佳方式。