簡體   English   中英

如何用 python 中同一數組的另一個值替換數組值?

[英]How do I replace array value with another value from same array in python?

我將 excel 工作表中的 37 行數據提供給 python 中的這段代碼。我試圖通過計算同一數組中數組中的某些值來增加值,然后用結果填充數組。 我已經走到這一步

需要弄清楚如何將第二組括號中的 beginningBalance 替換為前一組括號中的 yearlyTotal。 我需要不斷地這樣做,以便 yearlTotal 不斷增加並推進到下一個 beginningBalance

此外,“beginningBalance”不必在 currentRow 中進行硬編碼,但必須從 1500 開始

import pprint


def getResults():
    mylist = []
    for n in range(1, 37 + 1):
        currentRow = {"age": 23 + n, "numOfYears": n,
                      "beginningBalance": 1500, "currentSalary": 72_000.00,
                      "dividendsAndGrowth": n, "yearlyDeposit": 8_640.00,
                      "yearlyTotal": n}

        mylist.append(currentRow)

        for x in mylist:
            x["dividendsAndGrowth"] = x["beginningBalance"] * 0.02

        for x in mylist:
            x["yearlyTotal"] = x["dividendsAndGrowth"] + x["yearlyDeposit"] + x["beginningBalance"]


    return mylist


if __name__ == "__main__":
    z = getResults()
    pprint.pprint(z)

這是一個例子,所以我希望第一個括號中的 yearlyTotal 成為第二個括號的 beginningBalance 等等

但正如您所看到的,除了年齡之外,結果只是在每個括號中重復出現。

我嘗試使用 for 循環實現 if 語句和/或在 for 循環結束時設置 x["beginningBalance"] = x["yearlyTotal"] 但沒有任何效果。 有任何想法嗎? 謝謝!

[{'age': 24,
  'beginningBalance': 1500,
  'currentSalary': 72000.0,
  'dividendsAndGrowth': 30.0,
  'numOfYears': 1,
  'yearlyDeposit': 8640.0,
  'yearlyTotal': 10170.0},
 {'age': 25,
  'beginningBalance': 1500,
  'currentSalary': 72000.0,
  'dividendsAndGrowth': 30.0,
  'numOfYears': 2,
  'yearlyDeposit': 8640.0,
  'yearlyTotal': 10170.0},
 {'age': 26,
  'beginningBalance': 1500,
  'currentSalary': 72000.0,
  'dividendsAndGrowth': 30.0,
  'numOfYears': 3,
  'yearlyDeposit': 8640.0,
  'yearlyTotal': 10170.0},

我想要 output 的樣本

[{'age': 24,
  'beginningBalance': 1500,
  'currentSalary': 72000.0,
  'dividendsAndGrowth': 30.0,
  'numOfYears': 1,
  'yearlyDeposit': 8640.0,
  'yearlyTotal': 10170.0},
 {'age': 25,
  'beginningBalance': 10170.0,
  'currentSalary': 72000.0,
  'dividendsAndGrowth': 203.40,
  'numOfYears': 2,
  'yearlyDeposit': 8640.0,
  'yearlyTotal': 19,013.40},
 {'age': 26,
  'beginningBalance': 19,013.40,
  'currentSalary': 72000.0,
  'dividendsAndGrowth': 380.27,
  'numOfYears': 3,
  'yearlyDeposit': 8640.0,
  'yearlyTotal': 28,033.67},

問題是您沒有更新循環內的 begginingBalance。

一個好的做法是減少您正在執行的 for 循環的數量(循環大小為 37 這並不重要,但在查看執行時間時它不會很好地擴展)。 我建議做這樣的事情:

mylist = []
beginningBalance = 1500
for n in range(1, 37 + 1):
    currentRow = {"age": 23 + n,
                  "numOfYears": n,
                  "beginningBalance": beginningBalance,
                  "currentSalary": 72_000.00,
                  "dividendsAndGrowth": n,
                  "yearlyDeposit": 8_640.00,
                  "yearlyTotal": n}
    # This can be elsewhere but might as well be here for not using redundant loops
    currentRow["dividendsAndGrowth"] = currentRow["beginningBalance"] * 0.02
    currentRow["yearlyTotal"] = currentRow["dividendsAndGrowth"] + currentRow["yearlyDeposit"] + currentRow["beginningBalance"]
    # Saving the yearly total in another variable so that the cumulative yearly total will increase
    beginningBalance = currentRow["yearlyTotal"]
    mylist.append(currentRow)

return mylist

此外,我忘了提一下,如果您知道循環將執行的迭代次數,建議預先分配 memory 然后運行循環,因為創建一個空列表並在每次迭代時附加到它會很差在循環中處理越來越多的迭代。

運行上面的代碼時,結果列表是:

{'age': 24, 'numOfYears': 1, 'beginningBalance': 1500, 'currentSalary': 72000.0, 'dividendsAndGrowth': 30.0, 'yearlyDeposit': 8640.0, 'yearlyTotal': 10170.0}
{'age': 25, 'numOfYears': 2, 'beginningBalance': 10170.0, 'currentSalary': 72000.0, 'dividendsAndGrowth': 203.4, 'yearlyDeposit': 8640.0, 'yearlyTotal': 19013.4}
{'age': 26, 'numOfYears': 3, 'beginningBalance': 19013.4, 'currentSalary': 72000.0, 'dividendsAndGrowth': 380.26800000000003, 'yearlyDeposit': 8640.0, 'yearlyTotal': 28033.668}
{'age': 27, 'numOfYears': 4, 'beginningBalance': 28033.668, 'currentSalary': 72000.0, 'dividendsAndGrowth': 560.67336, 'yearlyDeposit': 8640.0, 'yearlyTotal': 37234.341360000006}
{'age': 28, 'numOfYears': 5, 'beginningBalance': 37234.341360000006, 'currentSalary': 72000.0, 'dividendsAndGrowth': 744.6868272000002, 'yearlyDeposit': 8640.0, 'yearlyTotal': 46619.028187200005}
{'age': 29, 'numOfYears': 6, 'beginningBalance': 46619.028187200005, 'currentSalary': 72000.0, 'dividendsAndGrowth': 932.3805637440001, 'yearlyDeposit': 8640.0, 'yearlyTotal': 56191.40875094401}
{'age': 30, 'numOfYears': 7, 'beginningBalance': 56191.40875094401, 'currentSalary': 72000.0, 'dividendsAndGrowth': 1123.82817501888, 'yearlyDeposit': 8640.0, 'yearlyTotal': 65955.23692596289}
{'age': 31, 'numOfYears': 8, 'beginningBalance': 65955.23692596289, 'currentSalary': 72000.0, 'dividendsAndGrowth': 1319.1047385192578, 'yearlyDeposit': 8640.0, 'yearlyTotal': 75914.34166448214}
{'age': 32, 'numOfYears': 9, 'beginningBalance': 75914.34166448214, 'currentSalary': 72000.0, 'dividendsAndGrowth': 1518.2868332896428, 'yearlyDeposit': 8640.0, 'yearlyTotal': 86072.62849777179}
{'age': 33, 'numOfYears': 10, 'beginningBalance': 86072.62849777179, 'currentSalary': 72000.0, 'dividendsAndGrowth': 1721.4525699554358, 'yearlyDeposit': 8640.0, 'yearlyTotal': 96434.08106772722}
{'age': 34, 'numOfYears': 11, 'beginningBalance': 96434.08106772722, 'currentSalary': 72000.0, 'dividendsAndGrowth': 1928.6816213545444, 'yearlyDeposit': 8640.0, 'yearlyTotal': 107002.76268908176}
{'age': 35, 'numOfYears': 12, 'beginningBalance': 107002.76268908176, 'currentSalary': 72000.0, 'dividendsAndGrowth': 2140.055253781635, 'yearlyDeposit': 8640.0, 'yearlyTotal': 117782.8179428634}
{'age': 36, 'numOfYears': 13, 'beginningBalance': 117782.8179428634, 'currentSalary': 72000.0, 'dividendsAndGrowth': 2355.656358857268, 'yearlyDeposit': 8640.0, 'yearlyTotal': 128778.47430172068}
{'age': 37, 'numOfYears': 14, 'beginningBalance': 128778.47430172068, 'currentSalary': 72000.0, 'dividendsAndGrowth': 2575.569486034414, 'yearlyDeposit': 8640.0, 'yearlyTotal': 139994.0437877551}
{'age': 38, 'numOfYears': 15, 'beginningBalance': 139994.0437877551, 'currentSalary': 72000.0, 'dividendsAndGrowth': 2799.880875755102, 'yearlyDeposit': 8640.0, 'yearlyTotal': 151433.9246635102}
{'age': 39, 'numOfYears': 16, 'beginningBalance': 151433.9246635102, 'currentSalary': 72000.0, 'dividendsAndGrowth': 3028.678493270204, 'yearlyDeposit': 8640.0, 'yearlyTotal': 163102.60315678042}
{'age': 40, 'numOfYears': 17, 'beginningBalance': 163102.60315678042, 'currentSalary': 72000.0, 'dividendsAndGrowth': 3262.0520631356085, 'yearlyDeposit': 8640.0, 'yearlyTotal': 175004.65521991602}
{'age': 41, 'numOfYears': 18, 'beginningBalance': 175004.65521991602, 'currentSalary': 72000.0, 'dividendsAndGrowth': 3500.0931043983205, 'yearlyDeposit': 8640.0, 'yearlyTotal': 187144.74832431434}
{'age': 42, 'numOfYears': 19, 'beginningBalance': 187144.74832431434, 'currentSalary': 72000.0, 'dividendsAndGrowth': 3742.8949664862866, 'yearlyDeposit': 8640.0, 'yearlyTotal': 199527.64329080062}
{'age': 43, 'numOfYears': 20, 'beginningBalance': 199527.64329080062, 'currentSalary': 72000.0, 'dividendsAndGrowth': 3990.5528658160124, 'yearlyDeposit': 8640.0, 'yearlyTotal': 212158.19615661664}
{'age': 44, 'numOfYears': 21, 'beginningBalance': 212158.19615661664, 'currentSalary': 72000.0, 'dividendsAndGrowth': 4243.163923132333, 'yearlyDeposit': 8640.0, 'yearlyTotal': 225041.36007974896}
{'age': 45, 'numOfYears': 22, 'beginningBalance': 225041.36007974896, 'currentSalary': 72000.0, 'dividendsAndGrowth': 4500.82720159498, 'yearlyDeposit': 8640.0, 'yearlyTotal': 238182.18728134394}
{'age': 46, 'numOfYears': 23, 'beginningBalance': 238182.18728134394, 'currentSalary': 72000.0, 'dividendsAndGrowth': 4763.643745626879, 'yearlyDeposit': 8640.0, 'yearlyTotal': 251585.83102697082}
{'age': 47, 'numOfYears': 24, 'beginningBalance': 251585.83102697082, 'currentSalary': 72000.0, 'dividendsAndGrowth': 5031.716620539416, 'yearlyDeposit': 8640.0, 'yearlyTotal': 265257.54764751025}
{'age': 48, 'numOfYears': 25, 'beginningBalance': 265257.54764751025, 'currentSalary': 72000.0, 'dividendsAndGrowth': 5305.1509529502055, 'yearlyDeposit': 8640.0, 'yearlyTotal': 279202.6986004604}
{'age': 49, 'numOfYears': 26, 'beginningBalance': 279202.6986004604, 'currentSalary': 72000.0, 'dividendsAndGrowth': 5584.053972009208, 'yearlyDeposit': 8640.0, 'yearlyTotal': 293426.75257246965}
{'age': 50, 'numOfYears': 27, 'beginningBalance': 293426.75257246965, 'currentSalary': 72000.0, 'dividendsAndGrowth': 5868.535051449393, 'yearlyDeposit': 8640.0, 'yearlyTotal': 307935.287623919}
{'age': 51, 'numOfYears': 28, 'beginningBalance': 307935.287623919, 'currentSalary': 72000.0, 'dividendsAndGrowth': 6158.70575247838, 'yearlyDeposit': 8640.0, 'yearlyTotal': 322733.9933763974}
{'age': 52, 'numOfYears': 29, 'beginningBalance': 322733.9933763974, 'currentSalary': 72000.0, 'dividendsAndGrowth': 6454.679867527949, 'yearlyDeposit': 8640.0, 'yearlyTotal': 337828.6732439254}
{'age': 53, 'numOfYears': 30, 'beginningBalance': 337828.6732439254, 'currentSalary': 72000.0, 'dividendsAndGrowth': 6756.573464878507, 'yearlyDeposit': 8640.0, 'yearlyTotal': 353225.24670880387}
{'age': 54, 'numOfYears': 31, 'beginningBalance': 353225.24670880387, 'currentSalary': 72000.0, 'dividendsAndGrowth': 7064.504934176078, 'yearlyDeposit': 8640.0, 'yearlyTotal': 368929.75164298}
{'age': 55, 'numOfYears': 32, 'beginningBalance': 368929.75164298, 'currentSalary': 72000.0, 'dividendsAndGrowth': 7378.5950328596, 'yearlyDeposit': 8640.0, 'yearlyTotal': 384948.34667583957}
{'age': 56, 'numOfYears': 33, 'beginningBalance': 384948.34667583957, 'currentSalary': 72000.0, 'dividendsAndGrowth': 7698.966933516792, 'yearlyDeposit': 8640.0, 'yearlyTotal': 401287.31360935635}
{'age': 57, 'numOfYears': 34, 'beginningBalance': 401287.31360935635, 'currentSalary': 72000.0, 'dividendsAndGrowth': 8025.746272187127, 'yearlyDeposit': 8640.0, 'yearlyTotal': 417953.0598815435}
{'age': 58, 'numOfYears': 35, 'beginningBalance': 417953.0598815435, 'currentSalary': 72000.0, 'dividendsAndGrowth': 8359.06119763087, 'yearlyDeposit': 8640.0, 'yearlyTotal': 434952.1210791744}
{'age': 59, 'numOfYears': 36, 'beginningBalance': 434952.1210791744, 'currentSalary': 72000.0, 'dividendsAndGrowth': 8699.042421583488, 'yearlyDeposit': 8640.0, 'yearlyTotal': 452291.1635007579}
{'age': 60, 'numOfYears': 37, 'beginningBalance': 452291.1635007579, 'currentSalary': 72000.0, 'dividendsAndGrowth': 9045.823270015158, 'yearlyDeposit': 8640.0, 'yearlyTotal': 469976.9867707731}

您的值不斷重復的原因是因為您的 beginningBalance 在循環內始終為 1500,這是一種方法,您可以將當前行基於前一行並遞增它。

def getResults():
    my_list = []
    starting_row = {
        "age": 24,
        "numOfYears": 1,
        "beginningBalance": 1500,
        "currentSalary": 72_000.00,
        "dividendsAndGrowth": 30.0,
        "yearlyDeposit": 8640.00,
        "yearlyTotal": 10170.0
    }

    my_list.append(starting_row)
    for n in range(1, 37):
        previous_row = my_list[n - 1]
        current_row = previous_row.copy()
        current_row["age"] = previous_row["age"] + 1
        current_row["numOfYears"] = previous_row["numOfYears"] + 1
        current_row["beginningBalance"] = previous_row["yearlyTotal"]
        current_row["dividendsAndGrowth"] = current_row["beginningBalance"] * 0.02
        current_row["yearlyTotal"] = current_row["dividendsAndGrowth"] + current_row["yearlyDeposit"] + current_row["beginningBalance"]
        my_list.append(current_row)

    return my_list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM