合并2个字典中的值(Python)
(我是Python新手!) 试图找出这个家庭作业问题: 该函数将需要一段时间s输入 两个字典,每个都将字符串映射到整数。该函数将为r埃图恩 将两个输入字典中的字符串映射到两个输入字典中整数总和的字典 我的想法是:合并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'
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已声明键集是相同的。