我刚刚开始学习Python,并尝试使用此代码连接字典:
dict1= {1: 10, 2: 203, 3: 1456}
dict2 = {1: 34, 2: 2034, 3: 176}
dict3 = {1: 134, 2: 2340, 3: 126}
finaldict = {**dict1,**dict2,**dict3}
print(finaldict)
但它只打印{1: 134, 2: 2340, 3: 126}
这有什么问题?
答案 0 :(得分:3)
每个字典只允许使用一次1
,2
和3
键。字典构造:
finaldict = {**dict1,**dict2,**dict3}
从左到右将键和值添加到finaldict
。所以它从dict1
开始,并具有
finaldict = {1: 10, 2: 203, 3: 1456}
现在它移动到dict2
,其1
,2
和3
的值也会被覆盖,从而覆盖10
,{{1} }和203
分别带有值1456
,34
和2034
。同样适用于它摄取176
。
答案 1 :(得分:2)
没有错,最后添加的值将替换其他值。
答案 2 :(得分:1)
字典不能有重复的键,因此,第三个字典的值替换/覆盖其他值,因为它们从左到右进行评估,从dict1
开始,然后dict2
和dict3
。
如果你的词典是,例如:
dict1= {9: 10, 8: 203, 7: 1456}
dict2 = {6: 34, 5: 2034, 4: 176}
dict3 = {3: 134, 2: 2340, 1: 126}
输出结果为:
{9: 10, 8: 203, 7: 1456, 6: 34, 5: 2034, 4: 176, 3: 134, 2: 2340, 1: 126}
但由于所有词典的键都相同,所以它们只是被新值所取代。
对于这种情况,我会使用一个 tuples
(键值对)数组来更好地处理这个问题,避免覆盖:
dict1= {1: 10, 2: 203, 3: 1456}
dict2 = {1: 34, 2: 2034, 3: 176}
dict3 = {1: 134, 2: 2340, 3: 126}
finalDict = list(dict1.items()) + list(dict2.items()) + list(dict3.items())
print(finalDict)
<强>输出:强>
[(1, 10), (2, 203), (3, 1456), (1, 34), (2, 2034), (3, 176), (1, 134), (2, 2340), (3, 126)]
另一种方法是使用字典理解来形成每个键的值列表,如下所示:
dict1 = {1: 10, 2: 203, 3: 1456}
dict2 = {1: 34, 2: 2034, 3: 176}
dict3 = {1: 134, 2: 2340, 3: 126}
newDict = {key: [value, dict2[key], dict3[key]] for key, value in dict1.items()}
print(newDict)
<强>输出:强>
{1: [10, 34, 134], 2: [203, 2034, 2340], 3: [1456, 176, 126]}
答案 3 :(得分:0)
问题在于您无法使用重复的键连接两个或多个词典。 如果您不想更改密钥名称,则应将其附加到列表中
dict3
答案 4 :(得分:0)
关于你期望的是重复键的值将被求和,这是一种方法
finaldict = {}
for d in (dict1,dict2,dict3):
for k,v in d.items():
if k in finaldict:
finaldict[k] += v
else:
finaldict[k] = v
Counter()
中有一个类似目录的collections
对象,即使在不存在的密钥上也可以使用+=
。你做好准备的时候我会让你看看。