将多个字典合并到一个嵌套字典(Python)

时间:2020-04-16 09:45:54

标签: python dictionary nested

说我有两个字典:

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

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

如何将这两个词典组合成状态>动物/花卉>值级别的嵌套字典。如下所示:

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

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

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用此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'}}

答案 1 :(得分:3)

尝试一下:

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)。

答案 2 :(得分:0)

似乎最有效的方法是

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是字典大小的总和。

还要注意,这是如何处理缺少花朵或缺少动物的情况的:字典将保留None。这可能取决于您的用例,也可能不是。