【问题标题】:In Python merge two dictionaries so that their keys are added/subtracted在 Python 中合并两个字典,以便添加/减去它们的键
【发布时间】:2015-10-11 20:46:39
【问题描述】:

我有两个字典,从sympy.ntheory 输出factorint。我需要合并它们,以便对公共键的值进行汇总,即MergedDict[key] = Dict1[key] + Dict2[key],而唯一键保持不变。

我还需要得到一个merged 字典,其中的公共键是不同的,即MergedDict[key] = Dict1[key] - Dict2[key]。这里Dict2 键总是Dict1 键的子集,所以没有负数问题。

我已尝试关注this question。但我无法让它工作。到目前为止,我的方法如下:

from sympy.ntheory import factorint
from collections import defaultdict

d=factorint(12)
dd = defaultdict(lambda: defaultdict(int))
for key, values_dict in d.items():
            for date, integer in values_dict.items():
                dd[key] += integer

for n in range(2,6):
    u = factorint(n)

    for key, values_dict in u.items():
        for date, integer in values_dict.items():
            dd[key] += integer

它给出了错误AttributeError: 'int' object has no attribute 'items'。上面的代码仅用于总结部分。然而,在差分部分做任何事情,假设汇总可以更改为在公共键的情况下进行差分。

【问题讨论】:

  • d 是一个dict 对象,由factorint 输出,不确定“你为什么期待一个字典?”是什么意思。如果方法有误,请告知。
  • 是的 factorint 是一个字典,但存储在字典中的值不是字典。 values_dict 在您的代码中是 int 而不是 dict

标签: python dictionary merge


【解决方案1】:

不确定您的目标是什么,但factorint 为您提供整数的键/值对,因此您应该对这些值求和,您正试图从dict 的每个 val 上调用 items,这是一个整数和显然行不通:

    from sympy.ntheory import factorint
    from collections import defaultdict

    d=factorint(12)
    dd = defaultdict(int)
    for key, val in d.items():
       dd[key] += val

    for n in range(2, 6):
        u = factorint(n)
        for key, val in u.items():
                dd[key] += val

    print(dd)

输出:

 defaultdict(<type 'int'>, {2: 5, 3: 2, 5: 1})

factorint 是一个 dict 不能有重复的键,所以第一个循环不能使用 update 来完成:

d = factorint(12)
dd = defaultdict(int)
dd.update(d)

for n in range(2, 6):
    u = factorint(n)
    for key, val in u.items():
            dd[key] += val

【讨论】:

  • 是的,这就是我要找的。 Python新手,要理解的东西太多了。感谢您的回答
  • @Frash,别担心,如果您遇到问题,print 是您调试的朋友
【解决方案2】:

看来collections.Counter 可以做你想做的大部分事情。它可能很简单(未经测试,我没有安装 sympy):

from collections import Counter
cnt1 = Counter(Dict1)
cnt2 = Counter(Dict2)
sum_cnt = cnt1 + cnt2
diff_cnt = cnt1 - cnt2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多