Python 如何合并任意数量的词典
给定任意数量的字典,如何将它们合并在一起,使合并的字典包含所有字典的元素以及对相似的键值求和 例如 我们的合并词典如下所示:Python 如何合并任意数量的词典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,给定任意数量的字典,如何将它们合并在一起,使合并的字典包含所有字典的元素以及对相似的键值求和 例如 我们的合并词典如下所示: {a: 5, b: 13, c: 4, d: 2} 这可以通过kwargs完成吗?我知道一个人可以做到: {**d1, **d2, **d3} 但是对于n定义的字典可以这样做吗?您可以使用计数器 从收款进口柜台 d1 = {'a': 2, 'b': 3, 'c': 1} d2 = {'a': 3, 'b': 2, 'c': 3} d3 = {'b': 8, 'd':
{a: 5, b: 13, c: 4, d: 2}
这可以通过kwargs完成吗?我知道一个人可以做到:
{**d1, **d2, **d3}
但是对于n定义的字典可以这样做吗?您可以使用计数器
从收款进口柜台
d1 = {'a': 2, 'b': 3, 'c': 1}
d2 = {'a': 3, 'b': 2, 'c': 3}
d3 = {'b': 8, 'd': 2}
list_of_dicts = [d1, d2, d3]
cnt = Counter()
for d in list_of_dicts:
cnt.update(d)
print(cnt)
你可以用柜台 从收款进口柜台
d1 = {'a': 2, 'b': 3, 'c': 1}
d2 = {'a': 3, 'b': 2, 'c': 3}
d3 = {'b': 8, 'd': 2}
list_of_dicts = [d1, d2, d3]
cnt = Counter()
for d in list_of_dicts:
cnt.update(d)
print(cnt)
根据您的评论,以下是一种类似于这些思路的方法。也就是说,我更喜欢的方法在回答
从集合导入defaultdict
def mergesum(*目录):
合并=默认dict(int)
对于k,v in(d中的项表示d中的项表示d.items()):
合并的[k]+=v
返回合并
d1={'a':2,'b':3,'c':1}
d2={'a':3,'b':2,'c':3}
d3={'b':8,'d':2}
结果=合并和(d1、d2、d3)
打印(结果)
#defaultdict(,{'a':5,'b':13,'c':4,'d':2})
根据您关于的评论,这里有一种方法。也就是说,我更喜欢的方法在回答
从集合导入defaultdict
def mergesum(*目录):
合并=默认dict(int)
对于k,v in(d中的项表示d中的项表示d.items()):
合并的[k]+=v
返回合并
d1={'a':2,'b':3,'c':1}
d2={'a':3,'b':2,'c':3}
d3={'b':8,'d':2}
结果=合并和(d1、d2、d3)
打印(结果)
#defaultdict(,{'a':5,'b':13,'c':4,'d':2})
即使kwargs可以应用于无限数量的字典,我认为在这里使用它也不是一个好主意,因为它不会累加键,而是丢弃键。您的{**d1,**d2,**d3}
表达式的计算结果是{'a':3,'b':8,'c':3,'d':2}
,而不是{a:5,b:13,c:4,d:2}
。您预期的输出似乎与您发布的输入不一致。它应该是{a:5,b:13,c:4,d:2}
吗?是的,谢谢-我已经相应地更新了它,即使kwargs可以应用于无限数量的字典,我认为在这里使用它不是一个好主意,因为它不加键,而是丢弃键。您的{**d1,**d2,**d3}
表达式的计算结果是{'a':3,'b':8,'c':3,'d':2}
,而不是{a:5,b:13,c:4,d:2}
。您预期的输出似乎与您发布的输入不一致。是不是应该是{a:5,b:13,c:4,d:2}
?是的,谢谢你-我已经根据默认字典(int)
进行了更新?据我所知,在使用计数器时,订单并不重要,而订单是通过计数器维护的defaultdict@OrangeReceptacle-Counter
和defaultdict
都是dict
的子类,因此我希望排序行为是相同的(但请注意,本例中的顺序取决于您使用的Python版本以及创建计数器或defaultdict
时使用的循环或其他方法产生的插入顺序。).字典对顺序本身并不敏感,所以我既不指望有什么特别之处,也不指望有什么特别之处be@Raphael-实际上这取决于Python版本,请参阅@benvc这很有趣。谢谢!这与defaultdictionary(int)相比如何
?据我所知,使用计数器时订单并不重要,而订单是通过计数器维护的defaultdict@OrangeReceptacle-Counter
和defaultdict
都是dict
的子类,因此我希望排序行为是相同的(但请注意,本例中的顺序取决于您使用的Python版本以及创建计数器或defaultdict
时使用的循环或其他方法产生的插入顺序。).字典对顺序本身并不敏感,所以我既不指望有什么特别之处,也不指望有什么特别之处be@Raphael-实际上这取决于Python版本,请参阅@benvc这很有趣。谢谢!
Counter({'b': 13, 'a': 5, 'c': 4, 'd': 2})
from collections import defaultdict
def mergesum(*dicts):
merged = defaultdict(int)
for k, v in (item for d in dicts for item in d.items()):
merged[k] += v
return merged
d1 = {'a': 2, 'b': 3, 'c': 1}
d2 = {'a': 3, 'b': 2, 'c': 3}
d3 = {'b': 8, 'd': 2}
result = mergesum(d1, d2, d3)
print(result)
# defaultdict(<class 'int'>, {'a': 5, 'b': 13, 'c': 4, 'd': 2})