说我有两个字典:
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)
上面的代码是手动工作的,但是我想知道更有效的方法来处理任何数量的状态。我想我会用循环重新排列键/值,但我想知道是否有一种有效的方法。
谢谢!
答案 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
。这可能取决于您的用例,也可能不是。