(我是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}
我的问题是我不明白如何将每个字典中的值相加。我知道' +'字典不支持。我不是在找任何人为我做作业,但任何建议都会非常感激!
答案 0 :(得分:3)
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):
您定义了一个带有两个参数的函数dicA
和dicB
。
dicA = {}
dicB = {}
然后为这两个变量分配一个空字典,覆盖传递给函数的字典。
newdictionary = dicA.update(dicB)
然后,您使用dicA
中的值更新dicB
,并将结果分配给newdictionary
。 dict.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