Python 为什么我的循环只能打印列表长度的一半?
我有一个60个元素的列表,现金流。我正在建立一个新的列表ListNPV,其中每个元素都是使用原始现金流中每个元素的等式的结果。将金额添加到新列表后,我从原始现金流中删除了一个元素 当我运行这个程序时,它正好完成了列表的一半,因此有30个值。我把代码翻了一倍来确保,结果是从30/30降到了15/45。我要0/60。使用树冠Python 为什么我的循环只能打印列表长度的一半?,python,loops,Python,Loops,我有一个60个元素的列表,现金流。我正在建立一个新的列表ListNPV,其中每个元素都是使用原始现金流中每个元素的等式的结果。将金额添加到新列表后,我从原始现金流中删除了一个元素 当我运行这个程序时,它正好完成了列表的一半,因此有30个值。我把代码翻了一倍来确保,结果是从30/30降到了15/45。我要0/60。使用树冠 for payment in CashFlow: NPV = 0 for i in range(len(CashFlow)):
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
由于下列原因
CashFlow.remove(payment)
上面这一行会影响现金流的长度。删除这一行,所有的迭代都会完成。之后,您可以单独删除现金流列表。从中,您不应更改正在迭代的列表:
如果需要修改在内部迭代的序列
建议使用循环(例如复制选定项目)
你先复印一份。在序列上迭代不会导致错误
隐式复制
在这种情况下,您甚至不使用循环变量,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
你在说什么语言?它看起来像Python,但是。。。还有,为什么你觉得这是最好的方法?您正在对正在迭代的同一个列表进行变异,这在许多情况下是一种不好的做法。它是Python,使用新的环境。这是我能想到的最好的东西,如果有其他想法,我会很感激的。对-但我需要根据现金流减去一个元素来计算ListNPV的新增加值。为此,将所有现金流内容复制到另一个集合中,然后循环一个集合,该集合应保持不变,并修改其他集合,并在此基础上进行计算。循环和修改同一个集合会导致案例难以调试和修复。使用
j=1
和i=0
进行迭代将导致(1+月利息)**(i-j)
部分等式的负幂,这在OP中不存在。编辑:哦,我知道这是不可能的,很好的解决方案。