连接字典会产生错误的输出

时间:2017-03-28 14:16:33

标签: python python-3.x dictionary

我刚刚开始学习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}

这有什么问题?

5 个答案:

答案 0 :(得分:3)

每个字典只允许使用一次123键。字典构造:

finaldict = {**dict1,**dict2,**dict3}

从左到右将键和值添加到finaldict。所以它从dict1开始,并具有

的键和值
finaldict = {1: 10, 2: 203, 3: 1456}

现在它移动到dict2,其123的值也会被覆盖,从而覆盖10,{{1} }和203分别带有值1456342034。同样适用于它摄取176

答案 1 :(得分:2)

没有错,最后添加的值将替换其他值。

答案 2 :(得分:1)

字典不能有重复的键,因此,第三个字典的值替换/覆盖其他值,因为它们从左到右进行评估,从dict1开始,然后dict2dict3

如果你的词典是,例如:

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对象,即使在不存在的密钥上也可以使用+=。你做好准备的时候我会让你看看。