比较词典列表/嵌套词典的词典

Comparing dictionary of list of dictionary/nested dictionary

提问人:Sandy 提问时间:11/22/2022 最后编辑:Sandy 更新时间:11/27/2022 访问量:49

问:

有两个 dict main 和 input,我想验证“输入”,以便字典和嵌套字典列表中的所有键(如果存在/所有键都是可选的)都与主键匹配,如果不是错误/不同的键,应该返回作为输出。

main = "app":[{
    "name": str,
    "info": [
        {
        "role": str,
        "scope": {"groups": list}
        }
        ]
    },{
    "name": str,
    "info": [
        {"role": str}
            ]
}]

input_data = "app":[{
    'name': 'nms',
    'info': [
        {
        'role': 'user',
        'scope': {'groups': ['xyz']
                }
        }]
},{
    'name': 'abc', 
    'info': [
    {'rol': 'user'}
    ]
}]

当将输入与主键进行比较时,应给出错误/不同的键作为输出,在这种情况下

['rol']

Python 列表 字典 递归 比较

评论


答:

1赞 LITzman 11/22/2022 #1

架构模块正是这样做的。 您可以捕获以查看哪些数据与您的模式不匹配。SchemaUnexpectedTypeError

此外,请确保不要将该词用作变量名称,因为它是内置函数的名称。input

0赞 Kevin Bhavsar 11/24/2022 #2
keys = []
def print_dict(d):
    if type(d) == dict:
        for val in d.keys():
            df = d[val]
            try:
                if type(df) == list:
                    for i in range(0,len(df)):
                        if type(df[i]) == dict:
                            print_dict(df[i])
            except AttributeError:
                pass
            keys.append(val)
    else:
        try:
            x = d[0]
            if type(x) == dict:
                print_dict(d[0])
        except:
            pass
    return keys
keys_input = print_dict(input)
keys = []
keys_main = print_dict(main)
print(keys_input)

print(keys_main)

for i in keys_input[:]:
        if i in keys_main:
            keys_input.remove(i)
print(keys_input)

这对我有用。您可以检查上面的代码片段,如果有任何更改,请提供更多信息,以便根据需要提供任何机会。

评论

0赞 NameVergessen 11/27/2022
默认情况下,字典比较嵌套。无需执行任何特殊操作。
0赞 NameVergessen 11/27/2022 #3

字典和列表比较默认嵌套的内容。

input_data == main如果您正确设置字典格式,应该会产生正确的输出。尝试在字典周围添加大括号“{”/“}”。它可能看起来像这样:

main = {"app": [{
    "name": str,
    "info": [
        {
        "role": str,
        "scope": {"groups": list}
        }
        ]
    },{
    "name": str,
    "info": [
        {"role": str}
            ]
}]}

input_data = {"app":[{
    'name': 'nms',
    'info': [
        {
        'role': 'user',
        'scope': {'groups': ['xyz']
                }
        }]
},{
    'name': 'abc',
    'info': [
    {'rol': 'user'}
    ]
}]}

input_data2 = {"app": [{
    'name': 'nms',
    'info': [
        {
            'role': 'user',
            'scope': {'groups': ['xyz']
                      }
        }]
}, {
    'name': 'abc',
    'info': [
        {'rol': 'user'}
    ]
}]}

比较结果应如下所示:

input_data2 == input_data # True
main == input_data # False