Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何合并任意数量的词典_Python_Python 3.x_Dictionary - Fatal编程技术网

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})