假设有两个二分法,其中一些键被钝化了。然后将两者结合起来,用d2键代替d1。
d1 = {
"2222": {1:3},
"3333":{1:5}
}
d2 = {
"2222": {1:5},
"4444":"a"
}
# expected output is
# {'2222': {1: 5}, '3333': {1: 5}, '4444': 'a'}我试过
d3 = {**d1, **d2} # works
d4 = dict(**d1, **d2) # failed
TypeError: type object got multiple values for keyword argument '2222'我不明白为什么d3 = {**d1, **d2}有效,但d4 = dict(**d1, **d2)失败了,**在这两个表达式中意味着什么?
发布于 2019-10-16 07:24:17
他们做的事情略有不同。
第一种类似于写作。
d3 = {"2222": {1:3}, "3333":{1:5}, "2222": {1:5}, "4444":"a"}在这里你用一个重复的键来定义一个字典。这是允许的(但可能不是个好主意)。字典将使用为重复键提供的最后一个值。
第二种类似于写作。
d4 = dict("2222"={1:3}, "3333"={1:5}, "2222"={1:5}, "4444"="a")这里调用dict传递关键字,并且一个关键字被重复两次。这在语言层面是被禁止的。(尝试使用"2222"作为关键字参数通常也是被禁止的,但它与**表示法一起工作。对于允许这样做是否是个好主意,意见不一。)
发布于 2019-10-16 07:42:45
**符号,称为kwarg (用于关键字参数),意味着参数是dictionary。d3 = {**d1, **d2}是python中合并字典的一个“技巧”。dict()是创建字典的内置方法,其构造函数的唯一可能形式是:dict(**kwarg) dict(映射,**kwarg) dict(可迭代,**kwarg)
d3 = dict(**d1, **d2)不可能与d3 = dict(d1, d2)不一样。最后,答案在dict()方法构造函数中。
发布于 2019-10-16 10:11:05
**是用于字典的Python解压缩操作符。
它接受字典中所有的键值对(或关键字参数的缩写),并返回函数参数(键值对)。
当您在花括号中解压两个字典d1和d2:{}时,它们会在字典结构中解压。
根据Python的官方文档:
字典中的,以后相同键的值总是会覆盖以前的键值,换句话说,d1和d2是浅合并的。
你得到的结果是:
{'2222': {1: 5}, '3333': {1: 5}, '4444': 'a'}你得到的结果是:
{'2222': {1: 3}, '3333': {1: 5}, '4444': 'a'}最近的价值占主导地位。
溶液
对于如何处理字典的解压缩,dict()函数有许多内部细微差别。
dict(**d1, **d2) 将尝试覆盖嵌套字典而不是合并它们,因此,在构造字典时,TypeError会尝试将多个值映射到相同的键。
相反,使用:
dict(d1, **d2)应该解决您的问题,因为它将第二个dict作为关键字参数传递给构造函数,而不是解压所有参数,并试图通过覆盖嵌套的键值对来构造字典。
如果希望保留d1中的值,则可以使用:
dict(d2, **d1)https://stackoverflow.com/questions/58407788
复制相似问题