检查字典是否是另一个字典的子集的递归函数

2023-12-14

我想递归地检查一本字典是否是另一本字典的子集。我们假设两个字典都有内置类型作为项目。

我看到已经有一个很旧的线程了Python:检查一个字典是否是另一个较大字典的子集试图解决类似但不完全是的问题...因为那里的答案都不符合我的目的,所以我决定发布我自己的答案solution在那里,但它仍然不完全完整,下面的函数在几乎所有情况下都可以正常工作,但在子集具有超集中不存在的值的情况下,它会严重失败,即:

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

        if isinstance(value, dict):
            if not is_subset(value, subset[key]):
                return False
        elif isinstance(value, str):
            if not subset[key] in value:
                return False
        elif isinstance(value, list):
            if not set(subset[key]) <= set(value):
                return False
        elif isinstance(value, set):
            if not subset[key] <= value:
                return False
        else:
            if not subset[key] == value:
                return False

    return True

superset = {'question': 'mcve', 'metadata': {}}
subset = {'question': 'mcve', 'metadata': {'author': 'BPL'}}

print(is_subset(superset, subset))

该函数返回 True,但它应该返回 False。那么,你会如何解决它?


你的代码逻辑是颠倒的。注意如何获取其中的每个元素superset并继续如果他们不在子集中。你想要做的就是获取其中的每个元素subset并检查一下他们在超组中.

这是代码的固定版本。

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

以下是给出正确结果的函数的一些示例。

superset = {'question': 'mcve', 'metadata': {}}
subset = {'question': 'mcve', 'metadata': {'author': 'BPL'}}

is_subset(superset, subset) # False

superset = {'question': 'mcve', 'metadata': {'foo': {'bar': 'baz'}}}
subset = {'metadata': {'foo': {}}}

is_subset(superset, subset) # True

superset = {'question': 'mcve', 'metadata': {'foo': 'bar'}}
subset = {'question': 'mcve', 'metadata': {}, 'baz': 'spam'}

is_subset(superset, subset) # False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查字典是否是另一个字典的子集的递归函数 的相关文章

随机推荐