检查嵌套字典是否是另一个嵌套字典的子集

时间:2015-03-29 17:45:11

标签: python dictionary

假设我有以下两个词典:

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

有人可以帮忙吗?

提前致谢。

2 个答案:

答案 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