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

时间:2016-04-03 21:04:52

标签: python dictionary

(我是Python的新手!) 试图找出这个功课问题: 该函数将输入两个字典,每个字典将字符串映射为整数。该函数将转换一个字典,将两个输入字典中的字符串映射到两个输入字典中的整数之和。

我的想法是:

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}

我的问题是我不明白如何将每个字典中的值相加。我知道' +'字典不支持。我不是在找任何人为我做作业,但任何建议都会非常感激!

7 个答案:

答案 0 :(得分:3)

来自documentation

  

update([other])

     

使用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)尚未出现,

key将检索现有0的值或生成key

答案 1 :(得分:2)

首先,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}

最简单的方法是使用collections.Counter来达到预期的效果。作为加分,它支持添加+

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}

答案 2 :(得分:1)

以下并不是最优雅的解决方案,而是要了解如何处理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}

答案 3 :(得分:0)

def ​add(​dicA,dicB):

您定义了一个带有两个参数的函数dicAdicB

dicA = {}
dicB = {}

然后为这两个变量分配一个空字典,覆盖传递给函数的字典。

newdictionary = dicA.update(dicB)

然后,您使用dicA中的值更新dicB,并将结果分配给newdictionarydict.update总是会返回None

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

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

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

如果您希望值自动汇总,请使用Counter代替普通字典:

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

答案 4 :(得分:0)

你可以试试这个:

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

答案 5 :(得分:0)

我怀疑你的教授希望用更简单的方法来达到这个目的。但您可以使用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

答案 6 :(得分:0)

我个人喜欢使用字典的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