Python 检查一个嵌套字典是否是另一个嵌套字典的子集
假设我有以下两个词典:Python 检查一个嵌套字典是否是另一个嵌套字典的子集,python,dictionary,Python,Dictionary,假设我有以下两个词典: dict1 = { 'battery1' : { 'Charge': 'enable', 'Discharge': 'enable' }, 'battery2' : { 'Charge': 'enable', 'Discharge': 'enable' } } dict2 = { 'Estimated battery run-time': '05:00 minutes', 'battery1': {'Device': 'controll
dict1 =
{
'battery1' : { 'Charge': 'enable', 'Discharge': 'enable' },
'battery2' : { 'Charge': 'enable', 'Discharge': 'enable' }
}
dict2 =
{
'Estimated battery run-time': '05:00 minutes',
'battery1': {'Device': 'controller', 'Discharge': 'enable',
'Charging State': 'Fully charged', 'Charge': 'disable'},
'battery2': {'Device': 'controller', 'Discharge': 'enable',
'Charging State': 'Fully charged', 'Charge': 'disable'}
}
我想检查dict1是否是dict2的一个子集(即dict1中的键值对是否显示在dict2中,而dict2中的相同键值是否可以包括额外的值,如充电状态和设备)
但我明白了
unhashable type: 'dict' error.
请注意,这与以下问题不同:
有人能帮忙吗
提前谢谢 您犯了一些错误。如果我知道你需要什么,那么这对我来说就行了。这是Python3版本。对于Python2,将dict.items()替换为dict.iterms() 例如,使用这些数据
dict1 = {
'battery1' : { 'Charge': 'enable', 'Discharge': 'enable' },
'battery2' : { 'Charge': 'enable', 'Discharge': 'enable' }
}
dict2a = {
'Estimated battery run-time': '05:00 minutes',
'battery1': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'enable'
},
'battery2': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'enable'
}
}
dict2b = {
'Estimated battery run-time': '05:00 minutes',
'battery1': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'disable'
},
'battery2': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'disable'
}
}
为每本字典运行它会得到正确的答案(我认为)
我有理由比较部分嵌套的DICT和列表,并得出以下结论:
def compare_partial_nested_data(small, big):
for skey in small:
found = False
for bkey in big:
bval, sval = bkey, skey # list values are the keys
if isinstance(small, dict) and isinstance(big, dict):
bval, sval = big[bkey], small[skey] # replace values if dict
if isinstance(sval, (dict, list)) and isinstance(bval, (dict, list)):
found = compare_partial_nested_data(sval, bval)
else:
found = skey==bkey and sval==bval
if found: break
if not found: return False
return True
测试:
您需要与
dict2[k][t]
进行比较,还需要使用mismatch=True
这里不完全清楚您想要的是什么,您可以扩展您期望的输出吗?为什么这一个被否决了?这个解决方案是有效的,并且满足了OP的要求。顺便说一句,这里有一个潜在的缺陷,即dict1中没有出现在dict2中的密钥永远不会被比较,使得dict1不是dict2的真正子集。通过添加一个else:在dict2
测试中,如果k1为,则返回False
。
dict1 = {
'battery1' : { 'Charge': 'enable', 'Discharge': 'enable' },
'battery2' : { 'Charge': 'enable', 'Discharge': 'enable' }
}
dict2a = {
'Estimated battery run-time': '05:00 minutes',
'battery1': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'enable'
},
'battery2': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'enable'
}
}
dict2b = {
'Estimated battery run-time': '05:00 minutes',
'battery1': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'disable'
},
'battery2': {
'Device': 'controller',
'Discharge': 'enable',
'Charging State': 'Fully charged',
'Charge': 'disable'
}
}
print(compare(dict1, dict2a)) # True
print(compare(dict1, dict2b)) # False
def compare_partial_nested_data(small, big):
for skey in small:
found = False
for bkey in big:
bval, sval = bkey, skey # list values are the keys
if isinstance(small, dict) and isinstance(big, dict):
bval, sval = big[bkey], small[skey] # replace values if dict
if isinstance(sval, (dict, list)) and isinstance(bval, (dict, list)):
found = compare_partial_nested_data(sval, bval)
else:
found = skey==bkey and sval==bval
if found: break
if not found: return False
return True
find = {
'zzz': [{'ccc': [{'ccc': 'ccc'}, 12345]}, 'abcde'],
'xxx': 'xxx',
}
message = {
'xxx': 'xxx',
'yyy': 'yyy',
'zzz': [
{'aaa': 'aaa'},
{'bbb': 'bbb'},
{'ccc': [
{'aaa': 'aaa'},
{'bbb': 'bbb'},
{'ccc': 'ccc'},
12345,
]},
{},
[],
67890,
'abcde',
]
}
print(compare_partial_nested_dicts(find, message))
> True