【问题标题】:Combining multiple dictionaries into a nested dictionary (Python)将多个字典组合成一个嵌套字典(Python)
【发布时间】:2020-07-29 12:23:33
【问题描述】:

假设我有两个字典:

animal = {
  "CA": "Grizzly Bear",
  "ID": "Appaloosa",
  "NY": 'Beaver'
}

flower = {
  "CA": "tulip",
  "ID": "syringa",
  "NY": 'rose'
}

如何将这两个字典组合成一个嵌套字典,级别为 state > animal/flower > value。像下面这样:

dict3 = {'CA': {'animal':'Grizzly Bear','flower':'tulip'},
         'ID': {'animal':'Appaloosa','flower':'syringa'},
         'NY': {'animal':'Beaver','flower':'rose'}}
print(dict3)

上面的代码是手动工作的,但我想知道一种更有效的方法来处理任何数量的状态。我想我会用循环重新排列键/值,但我想知道是否有一种有效的方法。

谢谢!

【问题讨论】:

    标签: python dictionary nested


    【解决方案1】:

    你可以使用这个与键相交的dict理解:

    >>> {k: {'animal': animal[k], 'flower': flower[k]} for k in animal.keys() & flower.keys()}
    {'CA': {'animal': 'Grizzly Bear', 'flower': 'tulip'}, 'NY': {'animal': 'Beaver', 'flower': 'rose'}, 'ID': {'animal': 'Appaloosa', 'flower': 'syringa'}}
    

    【讨论】:

      【解决方案2】:

      试试这个:

      animal = { "CA": "Grizzly Bear", "ID": "Appaloosa", "NY": 'Beaver' }
      
      flower = { "CA": "tulip", "ID": "syringa", "NY": 'rose' }
      
      dict3 = { }
      for k in animal.keys() & flower.keys():
          dict3[k] = {"animal":animal[k], "flower":flower[k]}
      
      print(dict3)
      
      

      或者

      最好的(Pythonic)方法是使用dict comprehension

      print({k:{"animal":animal[k], "flower":flower[k]} for k in animal.keys() & flower.keys()})
      

      输出:

      {'CA': {'animal': 'Grizzly Bear', 'flower': 'tulip'}, 'ID': {'animal': 'Appaloosa', 'flower': 'syringa'}, 'NY': {'animal': 'Beaver', 'flower': 'rose'}}
      

      注意:

      我使用& 来获取两个字典中的intersections 键。使用它,我们确保我们使用两个字典中都存在的键(用于制作我们的新字典)(否则,您可能会得到KeyError)。

      【讨论】:

      • 是的,比我的回答更善于解释:-)
      【解决方案3】:

      似乎最有效的方法是

      keys = set(animal.keys()).update(flower.keys())
      dict3 = {key: dict(animal=animal.get(key), flower=flower.get(key))
               for key in keys}
      

      它适用于 O(N),其中 N 是您的字典大小的总和。

      还要注意它如何处理丢失花或丢失动物的情况:dict 将保存None。这可能是也可能不是您想要的,具体取决于您的用例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2019-04-06
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-31
        相关资源
        最近更新 更多