繁体   English   中英

如何检查dict是否是另一个复杂dict的子集

[英]How to check if dict is subset of another complex dict

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

超集:

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

这是一种方法,是否足以满足您的用例?

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

您可以遍历复杂字典,并在每个阶段尝试将当前字典与潜在子集字典进行匹配:

def d_eq(d, d1):
   if not isinstance(d, (dict, list)):
      return d == d1
   if isinstance(d, list):
      return all(d_eq(a, b) for a, b in zip(d, d1))
   return all(d.get(i) == d1[i] or d_eq(d.get(i), d1[i]) for i in d1)

def is_sub(d, d1):
  if isinstance(d, list):
     return any(is_sub(i, d1) for i in d)
  return d_eq(d, d1) or (isinstance(d, dict) and any(is_sub(b, d1) for b in d.values()))

print(is_sub(dct_1, dict_2))

输出:

True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM