假设我有一个dicts列表。 例如,该列表包含以下字符:
{'david': {'status': 'available', 'type': 'human, 'location': [2, 3, 4]}, 'kuka': {'type': 'robot'}}
{'david': {'status': 'available', 'location': [2, 3, 4]}, 'kuka': {'status': 'available', 'type': 'robot'}}
(嵌套级别不固定)
因此,我希望:
{'david': {'status': 'available', 'location': [2, 3, 4]}, 'kuka': {'type': 'robot'}}
因此,我希望有一个dict,它包含两个dicts中存在的公共元素,而不仅仅是键。
谢谢你的帮助。
答案 0 :(得分:3)
您可以递归迭代所有字典键。写这个最紧凑的方式可能是
def common_items(d1, d2):
return {k: common_items(d1[k], d2[k]) if isinstance(d1[k], dict) else d1[k]
for k in d1.viewkeys() & d2.viewkeys()}
我建议将字典理解拼写为for循环以使代码更具可读性,并允许在有不同值的情况下引发错误:
def common_items(d1, d2):
result = {}
for k in d1.viewkeys() & d2.viewkeys():
v1 = d1[k]
v2 = d2[k]
if isinstance(v1, dict) and isinstance(v2, dict):
result[k] = common_items(v1, v2)
elif v1 == v2:
result[k] = v1
else:
raise VallueError("values for common keys don't match")
return result
答案 1 :(得分:0)
我不太明白'交叉'是什么意思。
如果要获取每个字典项的公共属性,可以使用set
获取具有以下代码的所有公共密钥。
common_keys = reduce(set.intersection, [set(i.keys()) for i in d.values()])
然后你可以迭代字典来过滤公共键和值。