【问题标题】:How to check if dict is subset of another complex dict如何检查字典是否是另一个复杂字典的子集
【发布时间】:2021-01-18 20:50:12
【问题描述】:

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

超集:

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

子集:

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

来自Recursive function to check dictionary is a subset of another dictionary 的回答我得到这个错误:

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

【问题讨论】:

  • 你在哪一行得到错误信息?

标签: python dictionary


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 2015-06-02
      • 2021-12-07
      • 2021-09-26
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多