在Python中获取嵌套字典的交集元素

时间:2016-07-21 11:29:55

标签: python dictionary nested

假设我有一个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中存在的公共元素,而不仅仅是键。


谢谢你的帮助。

2 个答案:

答案 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()])

然后你可以迭代字典来过滤公共键和值。