有没有办法在 Python 算法的迭代之间保存值?

问题描述 投票:0回答:0

我有一个将一些数据打印到 CSV 文件的类。数据是通过我代码中其他地方的算法计算的,结果列表被发送到下面的方法。 结果中有一个元素,我们想看看它与以前的结果相比有何变化,并保存这些值以供将来比较。我将这些值保存在字典中,我使用名称(我给出的另一个值)作为键,但现在我遇到了一个测试用例,其中两种类型具有相同的名称,并且没有其他不可变值我可以使用。这在代码的其他任何地方都不是问题(算法不关心它们的名称),但我不知道如何区分它们。 每次的结果应该是相同的顺序,但我不想指望这个。

我能想到的最好的解决方案是在名称的末尾添加一个 $ 符号(请参阅下面的修补程序),但这对我来说看起来很草率并且仍然依赖于相同顺序的值。或者,我可以创建一个列表或数组而不是字典,这会更整洁但更依赖于顺序。

from csv import writer

class CSVPrinter():
    def __init__(self, filename=None):
        self.filename = filename if filename else "test_file"
        self.prev_totals = {}

    def write(self, rows):
        """ Write given rows to CSV file """
        with open(self.filename, "a", encoding="utf-8") as csv_file:
            writer(csv_file).writerows(rows)

    def print_results(self, results):
        """ Print results (already calculated) """
        new_totals = {}
        sum_change = 0
        for res in results:
            title = res[0]
            while title in new_totals:
                title += "$"  # hotfix
            change = res[4] - self.prev_totals.get(title, 0)
            res.append(round(change, 4))
            new_totals[title] = res[4]
            sum_change += change
        self.write(
            results + [["", "", "", "", "", round(sum_change, 4)]]
        )
        self.prev_totals = new_totals

csvp = CSVPrinter("test_file")
# Print sample data. Normally print_results() would be called from within the algorithm.
csvp.print_results([["Res_A", 100, 200, 100, 100], ["Res_A", 200, 200, 300, 200], ["Res_B", 400, 200, 300, 200]])
csvp.print_results([["Res_A", 100, 300, 0, 200], ["Res_A", 200, 300, 100, 200], ["Res_B", 200, 0, 50, 500]])

预期结果:(csv)

Res_A,100,200,100,100,100
Res_A,200,200,300,200,200
Res_B,400,200,300,200,200
,,,,,500
Res_A,100,300,0,200,100
Res_A,200,300,100,200,0
Res_B,200,0,50,500,300
,,,,,400

有没有更简洁的方法来处理这个问题而不必创建更多数据(例如在系统其他地方创建的唯一 ID)?

python csv
© www.soinside.com 2019 - 2024. All rights reserved.