首页 > 解决方案 > 如何检查字典是否是另一个复杂字典的子集

问题描述

我需要验证另一个字典是否是另一个字典的子集,有一个技巧是在这些字典中有一个字典数组。

超集:

   dct_1 = {
        'x': 'x',
        'y': [
            {
                't': '123',
                'a': 'a'
            }
        ]
    }

子集:

dict_2 = {
        'x': 'x',
        'y': [
            {
                't': '123'
            }
        ]
    }

递归函数检查字典是另一个字典答案的子集我收到此错误:

TypeError: unhashable type: 'dict'

我的代码:

def is_subset(superset, subset):
    for key, value in subset.items():
        if key not in superset:
            return False

        if isinstance(value, dict):
            if not is_subset(superset[key], value):
                return False

        elif isinstance(value, str):
            if value not in superset[key]:
                return False

        elif isinstance(value, list):
            if not set(value) <= set(superset[key]):
                return False
        elif isinstance(value, set):
            if not value <= superset[key]:
                return False

        else:
            if not value == superset[key]:
                return False

    return True


class Test(unittest.TestCase):

    def setUp(self):
        self.dct = {
            'x': 'x',
            'y': [
                {
                    't': '123',
                    'a': 'a'
                }
            ]
        }

    def check_is_subset_true(self, superset, subset):
        return self.assertEqual(is_subset(superset, subset), True)

    def test_is_true(self):
        self.check_is_subset_true(self.dct, {
            'x': 'x',
            'y': [
                {
                    't': '123'
                }
            ]
        })

标签: pythondictionary

解决方案


这是一种方法,对您的用例来说足够了吗?

def is_subset(superset, subset):
    if type(superset) != type(subset):
        return False
    
    if isinstance(subset, dict):
        for key, value in subset.items():
            try:
                if not is_subset(superset[key], value):
                    return False
            except KeyError:
                return False
                
    elif isinstance(subset, list):
        for sub_e, super_e in zip(subset, superset):
            if not is_subset(super_e, sub_e):
                return False

    else:
        if superset != subset:
            return False
        
    return True
        

is_subset(dict_1, dict_2)
# True

推荐阅读