【问题标题】:Summing two dictionaries read from pickled/unpickled files总结从腌制/未腌制文件中读取的两个字典
【发布时间】:2020-12-09 08:26:12
【问题描述】:

我有两个结构相同但值不同的字典。 我用其他一些代码生成它们,然后使用pickle保存到文件中。 每个字典看起来像这样:

old_damage=

{"['1000']": {'13': '1.00E+00', '5': '1.00E+00', ...,
 "['1001']": {'13': '1.00E+00', '5': '1.00E+00', ...}

我的意图是取消腌制它们并逐个键对值求和。例如,如果我想将上面的字典与自身相加,我想得到如下结果:

accumulated_damage=
    {"['1000']": {'13': '2.00E+00', '5': '2.00E+00', ...,
     "['1001']": {'13': '2.00E+00', '5': '2.00E+00', ...}

我做了以下尝试:

accumulated_damage = {}
accumulated_damage.update(old_damage)
accumulated_damage.update(current_damage)

for i in old_damage.keys():
    for j in old_damage[i].keys():
        try:
            addition = float(current_damage[i][j])+float(old_damage[i][j])
            accumulated_damage[i][j]=addition
        except KeyError:
            continue
   

不幸的是,这为第一个字典键 ['1000'] 提供了正确的结果,但后续键的结果不正确。 (current_damage 字典被覆盖,这会影响总和,例如,字典键 ['1001'] 的值为 3 而不是 2)

我该如何解决这个问题? 谢谢。

【问题讨论】:

    标签: python dictionary sum pickle


    【解决方案1】:

    我用一个小词典做了一个小测试,它应该适用于你的情况

    d1 = {
        "1000":
            {13:1,
            5:1},
        "1001":
            {14:2,
            5:2}
    }
    
    d2 = {
        "1000":
            {13:-1,
            5:-1},
        "1001":
            {14:-2,
            5:-2}
    }
    
    d3 = d1.copy()
    
    for k in d1.keys():
        for x in d1[k]:
            d3[k][x] = d1[k][x]+d2[k][x]
    
    

    结果:

    d3
    {'1000': {5: 0, 13: 0}, '1001': {5: 0, 14: 0}}
    

    如您所见,数值相加,每种情况的结果为零

    【讨论】:

    • 如果我的回答有用,您可以将其标记为已接受的答案吗?
    【解决方案2】:

    您需要从每个 key, value 对中获取 value 变量的值的总和。然后根据key更新value。

    old_damage = {"['1000']": {'13': '1.00E+00',
                               '5': '1.00E+00'},
                  "['1001']": {'13': '1.00E+00',
                               '5': '1.00E+00'}}
    
    for key, val in old_damage.items():
        sum_val = sum(float(v) for v in val.values())
        for k in val.keys():
            old_damage[key][k] = str(sum_val)
    
    print("Updated: {}".format(old_damage))
    

    结果:

    Updated: {"['1000']": {'13': '2.0', '5': '2.0'}, "['1001']": {'13': '2.0', '5': '2.0'}}
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多