提问人:Sandy 提问时间:11/22/2022 最后编辑:Sandy 更新时间:11/27/2022 访问量:49
比较词典列表/嵌套词典的词典
Comparing dictionary of list of dictionary/nested dictionary
问:
有两个 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']
答:
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
评论