Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查一个嵌套字典是否是另一个嵌套字典的子集_Python_Dictionary - Fatal编程技术网

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