为什么循环中的循环只打印列表长度的一半?

时间:2015-01-11 05:18:38

标签: python loops

我有一个包含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

2 个答案:

答案 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的长度。移除此行,您的所有迭代都将完成。之后,您可以单独删除现金流量表。