当前位置: 首页 > 知识库问答 >
问题:

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

伯向晨
2023-03-14

假设我有以下两本词典:

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的子集(即dict 1中的键值对是否显示在dict2中,而dict2中的相同键值将包括额外的值,如充电状态和设备)。

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. 

请注意,这是一个不同的问题:

遍历所有嵌套字典值?

对嵌套字典的嵌套值求和

循环访问嵌套字典

有人能帮忙吗?

提前致谢。

共有2个答案

暨承平
2023-03-14

我有理由比较部分嵌套的字典和列表,并提出了这个:

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
晋涛
2023-03-14

您遇到了一些错误。如果我理解你需要什么,那么这对我有用。这是蟒蛇3版本。对于蟒蛇 2,将字典项目 () 替换为字典( )

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
 类似资料:
  • 问题内容: 我正在尝试编写一个自定义过滤器方法,该方法接受任意数量的 kwargs 并返回一个列表,该列表包含包含这些 kwargs 的类似数据库的列表的元素。 例如,假设和=相同。结果为True。但是,假设=同一件事,再加上其他事情。我的方法需要能够确定 d1是否在d2中 ,但是Python无法使用字典来做到这一点。 内容: 我有一个字类,并且每个对象都有类似的属性,,,等等。我希望能够在这些单

  • 我正在努力编写一本嵌套非常多的词典。只有当字典中有“name”:“bingo”时,我才需要获取字典的“main_id”。 我有解决办法,但在我看来是相当丑陋的。 我想知道: 有更好更干净的方法来实现它(总是;)

  • 问题内容: 有没有一种方法可以为嵌套的python字典定义XPath类型查询。 像这样: 我还需要选择嵌套列表;) 这可以通过@jellybean的解决方案轻松完成: [EDIT 2016]这个问题和公认的答案都是古老的。更新的答案可能比原始答案做得更好。但是,我没有测试它们,所以我不会更改已接受的答案。 问题答案: 并不完全漂亮,但是您可能会使用 当然,这不支持xpath之类的东西,例如索引……

  • 问题内容: 是否有更可读的方法来检查是否存在嵌入字典的键而无需独立检查每个级别? 可以说我需要在埋藏的对象中获取此值(示例取自Wikidata): 为了确保不会以运行时错误结束,有必要检查每个级别,如下所示: 我可以想到的另一种解决方法是将其包装到一个结构中,对于这样一个简单的任务,我也觉得很尴尬。 我正在寻找类似的东西: 如果所有级别都存在,则返回。 问题答案: 简而言之,使用Python,您必

  • 问题内容: 我在理解Python3中的嵌套字典理解时遇到了麻烦。从下面的示例中得到的结果输出的是正确的结构,没有错误,但仅包含一个内部键:值对。我还没有找到像这样的嵌套字典理解的例子。谷歌搜索“嵌套词典理解python”显示了遗留示例,非嵌套理解或使用其他方法解决的答案。我可能使用了错误的语法。 例: 此示例应返回原始字典,但内部值由修改。 outside_dict词典的结构以及结果: 问题答案:

  • rank ▲ ✰ vote url 47 435 86 477 url 检查一个键在字典中是否存在 在更新字典之前想检查键是否存在.我写了如下代码: if 'key1' in dict.keys(): print "blah" else: print "boo" 我想这不是最好的方法,还有什么更好的方法? 用in. d = dict() for i in xrange(100):