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

3

假设我有两个字典:

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)

上述代码在手动操作时可以正常工作,但我想知道如何更有效地处理任意数量的状态。我想通过循环重新排列键/值对,但我想知道是否有更有效的方法。
谢谢!
3个回答

4
你可以使用这个字典解析,它会交集所有的键:
>>> {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'}}

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)的方式是使用字典推导式

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'}}

注意:

我使用了&来获取两个字典中键的交集。通过这样做,我们确保使用的键(用于创建新字典)同时存在于两个字典中(否则,可能会出现KeyError错误)。


1
是的,比我的回答好解释多了 :-) - RoadRunner

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。这可能是您想要的,也可能不是,具体取决于您的用例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接