【问题标题】:Concatenating Dictionaries gives wrong output连接字典给出错误的输出
【发布时间】:2017-08-21 16:08:20
【问题描述】:

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

这有什么问题?

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    字典不能有重复的键,因此,第三个字典的值会替换/覆盖其他值,因为它们是从左到右评估的,从 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】:

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

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

      从左到右将键和值添加到finaldict。所以它以dict1 开头,键和值是

      finaldict = {1: 10, 2: 203, 3: 1456}
      

      现在它继续前进 dict2,它也具有 123 的值,从而用值 34 覆盖 1020314562034176。当它摄取 dict3 时也是如此。

      【讨论】:

        【解决方案4】:

        问题是您不能用重复的键连接两个或多个字典。 如果您不想更改键名,则应将它们附加到列表中

        dict_list = []
        dict_list.append(dict)
        

        【讨论】:

          【解决方案5】:

          如果您期望重复键的值会被求和,这是一种方法

          finaldict = {}
          for d in (dict1,dict2,dict3):
              for k,v in d.items():
                  if k in finaldict:
                      finaldict[k] += v
                  else:
                      finaldict[k] = v
          

          collections 中有一个类似目录的Counter() 对象,即使在不存在的键上也可以使用+=。等你准备好了,我会让你查一下。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-10
            • 2018-06-12
            • 1970-01-01
            • 2020-09-08
            • 2014-03-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多