我有一个将一些数据打印到 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)?