合并2个字典中的值(Python)

合并2个字典中的值(Python),python,dictionary,Python,Dictionary,(我是Python新手!) 试图找出这个家庭作业问题: 该函数将需要一段时间​s输入​ 两个字典,每个都将字符串映射到整数。该函数将为r​埃图恩​ 将两个输入字典中的字符串映射到两个输入字典中整数总和的字典 我的想法是: def ​add(​dicA,dicB): dicA = {} dicB = {} newdictionary = dicA.update(dicB) 然而,这又带来了None 在教授的例子中: print(add({'alice':10, 'Bob'

(我是Python新手!) 试图找出这个家庭作业问题: 该函数将需要一段时间​s输入​ 两个字典,每个都将字符串映射到整数。该函数将为r​埃图恩​ 将两个输入字典中的字符串映射到两个输入字典中整数总和的字典

我的想法是:

def ​add(​dicA,dicB):
    dicA = {}
    dicB = {}
    newdictionary = dicA.update(dicB)
然而,这又带来了
None

在教授的例子中:

print(add({'alice':10, 'Bob':3, 'Carlie':1}, {'alice':5, 'Bob':100, 'Carlie':1}))
输出为:

{'alice':15, 'Bob':103, 'Carlie':2}
我的问题是,我不知道如何将每个字典中的值相加。我知道字典不支持“+”。我不想找任何人帮我做作业,但任何建议都将不胜感激

def ​add(​dicA,dicB):
您定义一个函数,该函数包含两个参数,
dicA
dicB

dicA = {}
dicB = {}
然后为这两个变量分配一个空字典,覆盖传递给函数的字典

newdictionary = dicA.update(dicB)
然后使用
dicB
中的值更新
dicA
,并将结果分配给
newdictionary
。但始终返回
None

最后,您不会从函数返回任何内容,因此它不会给出任何结果


为了组合这些字典,您实际上需要使用传递给它的值。由于
dict.update
会对调用它的字典进行变异,这将更改其中一个已传递的字典,而我们通常不希望这样做。因此,我们使用一个空字典,然后将两个字典中的值复制到其中:

def add (dicA, dicB):
    newDictionary = {}
    newDictionary.update(dicA)
    newDictionary.update(dicB)
    return newDictionary

如果要自动求和这些值,请使用字典而不是普通字典:

from collections import Counter
def add (dicA, dicB):
    newDictionary = Counter()
    newDictionary.update(dicA)
    newDictionary.update(dicB)
    return newDictionary

首先,
a.update(b)
a
更新到位,并返回
None
。 其次,
a.update(b)
不会帮助您计算密钥总数;它只会生成一个字典,其结果字典包含
b
中的所有键、值对:

>>> a = {'alice':10, 'Bob':3, 'Carlie':1}
>>> b = {'alice':5, 'Bob':100, 'Carlie':1}
>>> a.update(b)
>>> a
{'alice': 5, 'Carlie': 1, 'Bob': 100}
这将是最容易使用,以达到预期的结果。另外,它还支持添加
+

from collections import Counter

def add(dicA, dicB):
    return dict(Counter(dicA) + Counter(dicB))
这将产生预期的结果:

>>> print(add({'alice':10, 'Bob':3, 'Carlie':1}, {'alice':5, 'Bob':100, 'Carlie':1}))
{'alice': 15, 'Carlie': 2, 'Bob': 103}
从:

更新([其他])

使用
other
中的键/值对更新字典,覆盖现有键。返回
None

您不希望替换键/值对,而是希望为类似键添加值。浏览每个字典并将每个值添加到相关键:

def ​add(​dicA,dicB):
    result = {}
    for d in dicA, dicB:
        for key in d:
            result[key] = result.get(key, 0) + d[key]
    return result
result.get(key,0)
将检索现有
键的值
,或者如果
尚未出现,则生成
0

您可以尝试以下操作:

def add(dict1, dict2):
  return dict([(key,dict1[key]+dict2[key]) for key in dict1.keys()])

我怀疑你的教授想用更简单的方法来实现这一点。但是,您可以使用
collections.Counter
轻松实现这一点

from collections import Counter

def add(a, b):
    return dict(Counter(a) + Counter(b))
你的教授可能想要这样的东西:

def add(a, b):
    new_dict = copy of a
    for each key/value pair in b
        if key in new_dict
            add value to value already present in new_dict
        else
            insert key/value pair into new_dict
    return new_dict

以下不是最优雅的解决方案,而是为了了解如何处理dicts

dictA = {'Alice':10, 'Bob':3, 'Carlie':1}
dictB = {'Alice':5, 'Bob':100, 'Carlie':1} 


# how to iterate through a dictionary
for k,v in dictA.iteritems():
        print k,v

# make a new dict to keep tally
newdict={}

for d in [dictA,dictB]:   # go through a list that has your dictionaries
    print d
    for k,v in d.iteritems():  # go through each dictionary item
        if not k in newdict.keys():
            newdict[k]=v
        else:
            newdict[k]+=v

print newdict
输出:

Bob 3
Alice 10
Carlie 1
{'Bob': 3, 'Alice': 10, 'Carlie': 1}
{'Bob': 100, 'Alice': 5, 'Carlie': 1}
{'Bob': 103, 'Alice': 15, 'Carlie': 2}

我个人喜欢使用字典的
get
方法进行这种合并:

def add(a, b):
    result = {}
    for dictionary in (a, b):
        for key, value in dictionary.items():
            result[key] = result.get(key, 0) + value
    return result

这两本字典保证有相同的键吗?@Natecat是的!对不起,我应该提到这一点。@GabbyAntunes在您所做的工作中,您希望在哪一点添加值?因为我没有看到任何添加^^^我相信OP的意图是代码应该将值添加在一起,例如,
collections.Counter()
请注意,这不会给出期望的结果,因为OP使用
update()
@AnttiHaapala Good point()搜索错误的树,补充道。虽然我的回答仍然很好地涵盖了OP方法的错误之处……但您可以使用
dicA
创建一个计数器
newDictionary=Counter(dicA)
然后
newDictionary.update(dicB)
另外值得一提的是
计数器
update()
方法添加计数,而不是替换计数。这是一个很好的标准解决方案。不过,就他的具体例子而言,由于这是一个家庭作业练习,我怀疑这是预期的结果,因为这篇文章除了输出之外,与预期的结果几乎没有什么不同。它缺少作者最初的尝试等@spectras确切地说:D,好像这将是一个解决家庭作业的网站。@Ilja>是的,这就是为什么我投了更高的票。它没有回答OP想要问的问题,但它确实回答了他提出的问题,而且对未来的读者来说,它可能比公认的问题更有价值。谢谢!每个人的评论都很有帮助,但我认为这正是我的教授希望我们做的!再次感谢你!如果dict1中存在密钥而dict2中不存在密钥,则此操作将失败(KeyError)。如果dict1中没有相应的值,它将丢失dict2中的值。基本上,您假设的是相同的密钥集。您必须在答案中指定它。@ffarquet OP已声明键集是相同的。