[英]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.