我有一个包含60个元素的列表,CashFlow。我正在构建一个新列表ListNPV,其中每个元素是使用原始CashFlow中的每个元素的等式的结果。将总和添加到新列表后,我从原始CashFlow中删除一个元素。
当我运行它时,它完成了列表的一半,所以30个值。我将代码加倍以确保,并且它导致从30/30下降15/45。我想要0/60。使用Canopy。
for payment in CashFlow:
NPV = 0
for i in range(len(CashFlow)):
NPV += CashFlow[i] / (1+MonthlyInterest)**i
NPV = round (NPV, 0)
ListNPV.append(NPV)
CashFlow.remove(payment)
print 'CashFlow = ', CashFlow
print 'ListNPV =', ListNPV
答案 0 :(得分:2)
从the python docs开始,您不应更改正在迭代的列表:
如果你需要修改你在内部迭代的序列 循环(例如复制所选项目),建议使用 你先复制一份。迭代序列不会 隐含地复制。
在这种情况下,您甚至不使用循环变量payment
,因此您可以稍微清理循环。这应该有效:
N = len(CashFlow)
for j in range(N):
NPV = 0
for i in range(j, N):
NPV += CashFlow[i] / (1+MonthlyInterest) ** (i - j)
NPV = round (NPV, 0)
ListNPV.append(NPV)
print 'CashFlow = ', CashFlow
print 'ListNPV =', ListNPV
答案 1 :(得分:1)
由于以下行
CashFlow.remove(payment)
以上行影响CashFlow的长度。移除此行,您的所有迭代都将完成。之后,您可以单独删除现金流量表。