假设我有以下两个词典:
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的一个子集(即如果dict2中的键值对显示在dict2中,而它确定dict2中的相同键将包括EXTRA值,如Charging state和Device)。
for k, v in dict1.iteritems():
for t, c in v.iteritems():
if k in dict2:
if c != dict2[k][v]:
mismatch = true
break;
但是我得到了
unhashable type: 'dict' error.
请注意,这是一个不同的问题:
Loop through all nested dictionary values?
Taking sums of nested values of nested dictionary
Iterate over nested dictionary
有人可以帮忙吗?
提前致谢。
答案 0 :(得分:0)
你有一些错误。如果我了解你的需要,那么这对我有用。这是python 3版本。对于python 2,将dict.items()
替换为dict.iteritems()
。
def compare(dict1, dict2):
for k1, v1 in dict1.items():
if k1 in dict2:
for k2, v2 in v1.items():
if v2 != dict2[k1][k2]:
return False
return True
例如,使用这些数据
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
答案 1 :(得分:0)
我有理由比较部分嵌套的字典和列表,并得出以下结论:
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