【问题标题】:Calculate a running total during a for loop - Python在 for 循环期间计算运行总计 - Python
【发布时间】:2011-06-27 05:44:49
【问题描述】:

编辑:以下是基于我收到的反馈/答案的工作代码。

这个问题源于我之前在使用 MIT 的开放课件学习 Python/CS 时提出的问题。 --See my previous question here--

我正在使用以下代码列出每月付款和其他内容。但是,在循环结束时,我需要给出每个月已支付的总金额的运行总计。

原始代码

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)


    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

    if month in xrange(12, 12+1):
        print 'RESULTS'
        print 'Total amount paid: '
        print 'Remaining balance: %.2f' % (remainingBalance,)

问题是我无法弄清楚如何保持已支付金额的总和。我尝试添加totalPaid = round(interestPaid + principalPaid, 2),但这只会导致一个月的总数,我似乎无法让它保持每个月的值,然后在最后将它们全部加起来以打印出来。

我也知道结果应该是 1131.12

当通过列表知道每个值时,我发现了许多这样做的示例,但我似乎无法正确推断。

固定代码

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))
totalPaid = 0

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)
    totalPaid += round(minPayment, 2)

    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

    if month in xrange(12, 12+1):
        print 'RESULTS'
        print 'Total amount paid: %.2f' % (totalPaid,)
        print 'Remaining balance: %.2f' % (remainingBalance,)

【问题讨论】:

  • 你为什么不更新 totalPaid?为什么将其设置为新值?为什么不在表达式中包含totalPaid

标签: python for-loop cumulative-sum


【解决方案1】:

在你的循环之前,初始化一个变量来累积值:

total_paid = 0

然后,在循环体中,添加适当的量。您可以使用+= 运算符添加到现有变量,例如

total_paid += 1

total_paid = total_paid + 1 的缩写形式。您不想每次迭代都给 total_paid 一个新值,而是想添加到其现有值。

我不确定您的问题的具体情况,但这是在循环时累积值的一般形式。

【讨论】:

  • 感谢您让我更清楚地了解这一点。我能够推断出你所说的并在循环之前添加了totalPaid = 0,在循环中我添加了totalPaid += round(minPayment, 2)
  • @tehaaron 没问题,总是乐于帮助学习 Python 的人
【解决方案2】:

您总是支付最低付款额?只需使用 minPayment 而不是再次计算该数学。保持一个运行总数,然后在循环之后打印出来。

balance = float(raw_input("Outstanding Balance: "))
interestRate = float(raw_input("Interest Rate: "))
minPayRate = float(raw_input("Minimum Monthly Payment Rate: "))
paid = 0

for month in xrange(1, 12+1):
    interestPaid = round(interestRate / 12.0 * balance, 2)
    minPayment = round(minPayRate * balance, 2)
    principalPaid = round(minPayment - interestPaid, 2)
    remainingBalance = round(balance - principalPaid, 2)
    paid += minPayment

    print  # Make the output easier to read.
    print 'Month: %d' % (month,)
    print 'Minimum monthly payment: %.2f' % (minPayment,)
    print 'Principle paid: %.2f' % (principalPaid,)
    print 'Remaining balance: %.2f' % (remainingBalance,)

    balance = remainingBalance

print
print 'RESULTS'
print 'Total amount paid:', paid
print 'Remaining balance: %.2f' % (remainingBalance,)

还要注意范围只有一个值,因此您只需检查月份 == 12,但这里根本不需要。

【讨论】:

  • 谢谢,这基本上正是我所做的,但我在阅读了 Rafe 的回答后得到了它,所以我把它给了他。 :) 在对我之前的问题发表评论后,我很感谢您的快速回复。
【解决方案3】:

这个answer 为我工作:

首先,创建派生值:

df.loc[0, 'C'] = df.loc[0, 'D']

然后遍历剩余的行并填充计算值:

for i in range(1, len(df)):
    df.loc[i, 'C'] = df.loc[i-1, 'C'] * df.loc[i, 'A'] + df.loc[i, 'B']
Index_Date A B C D
2015/01/31 10 10 10 10
2015/02/01 2 3 23 22
2015/02/02 10 60 290 280

【讨论】:

  • 编辑您的答案以便可读(作为代码)。
【解决方案4】:

您实际上必须将 totalPaid 初始化为 0,然后

totalPaid = round(interestPaid + principalPaid, 2) + totalPaid

在循环内部。你的问题是你没有累积总数,你只是在每次迭代中设置一个新的。

【讨论】:

    【解决方案5】:

    听起来你很接近。问题是您每次都覆盖了总数。试试这样的:

    totalPaid = totalPaid + round(interestPaid + principalPaid, 2)
    

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多