Python 如何检查嵌套级别可变的字典中的所有值是否真实?
我调用的各种API端点返回各种复杂度的响应对象,我需要通过未知级别的列表和/或字典嵌套数据结构进行解析 例如,如果我返回一个响应并在此处将json转换为字典:Python 如何检查嵌套级别可变的字典中的所有值是否真实?,python,python-2.7,Python,Python 2.7,我调用的各种API端点返回各种复杂度的响应对象,我需要通过未知级别的列表和/或字典嵌套数据结构进行解析 例如,如果我返回一个响应并在此处将json转换为字典: response = { "key1":"value1", "key2":"value2", "key3":"value3", "key4":[ "item1", "item2" ], "key5":"value4", "key6":"value5", "key7":
response = {
"key1":"value1",
"key2":"value2",
"key3":"value3",
"key4":[
"item1",
"item2"
],
"key5":"value4",
"key6":"value5",
"key7":{
"key1":"value1",
"key2":"value2",
"key3":"value3",
"key4":"value4",
"key5":"value5",
"key6":"value6"
},
"key8":"value6"
}
我下面的方法会起作用,因为它只处理嵌套中一个层次的列表或字典:
def check_values(payload):
values = []
for value in payload.values():
if isinstance(value, list):
for item in value:
values.append(bool(item))
elif isinstance(value, dict):
for nested_value in value.values():
values.append(bool(nested_value))
else:
values.append(bool(value))
if all(values):
return True
return False
print(check_values(response))
但是,如果我有这样的东西,我上面的方法将不起作用:
response = {
"key1": {"foobar" : ["a", None, {"xyz": 123}]},
"key2":"value2",
"key3":"value3",
"key4":[
[4, 5, 6],
[[[[[[[[[[[[[[[[[[[["hi"]]]]]]]]]]]]]]]]]]]]
],
"key5":"value4",
"key6":"value5",
"key7":{
"key1":"value1",
"key2":"value2",
"key3":"value3",
"key4":"value4",
"key5":"value5",
"key6":"value6"
},
"key8":"value6"
}
如有任何想法或建议,将不胜感激。=) “key4”:[[4,5,6],[4]#试试这个],因为列表是空的,也许这就是为什么你会得到False**bool([])False**@Tanmayjain,这是故意的,是为了显示我方法的缺点。即使没有空列表,该方法仍应返回False,因为嵌套列表中没有项ahhh…谢谢!这个解决方案适合我,而且更优雅。@JeffreyLee请检查我所做的更改,以免在某些情况下产生错误的输出。是的,看起来我说得太快了,我尝试了以下方法,但不起作用:
response={“key1”:{“foobar”:[“a”,“b”,“{“xyz”:123}],“key2”:“value2”,“key3”:“value3”,“键4:[[4,5,6],[[4][[5][[4][[5][[1][[2][[hi][hi][hi][hi][hi][hi][hi hi][hi hi][hi hi][hi hi hi][hi hi hi hi hi hi hip][hip][hip][hip][hip][hip][hip][3][key5:“value4”,“key6:][value5”,“key5”,“key6:][value5”,“True][True][True][False][False][False][key7:{key1:“key1”,“key2:value6“,{“one”:1}”,现在应该可以工作了“]}
@JeffreyLee它的输出为False,这样它就可以正常工作了吗?不,因为我在那可笑的嵌套列表组中有字符串“hi”,而不是空字符串
f_response = {
'val0':[1,2,3,[True],[42]],
'val1':{}, # assuming {} ,[] are Falsey values bool({}) False
'val2':['x'],
'val3':[[[False]]]
}
t_response = {
'val0':[1,2,3,[True],[42]],
'val1':{1:[43]},
'val2':['x'],
'val3':[[[True,[True]]]]
}
response = {
"key1": {"foobar" : ["a", None, {"xyz": 123}]},
"key2":"value2",
"key3":"value3",
"key4":[
[4, 5, 6],
[]
],
"key5":"value4",
"key6":"value5",
"key7":{
"key1":"value1",
"key2":"value2",
"key3":"value3",
"key4":"value4",
"key5":"value5",
"key6":"value6"
},
"key8":"value6"
}
def check_values(payload):
if isinstance(payload, dict):
if payload != {}:
for value in payload.values():
if isinstance(value, list):
if not check_values(value):
return False
elif isinstance(value, dict):
if not check_values(value):
return False
else:
if not bool(value):
return False
else:
return False
elif isinstance(payload, list):
if payload != []:
for value in payload:
if isinstance(value, list):
if not check_values(value):
return False
elif isinstance(value, dict):
if not check_values(value):
return False
else:
if not bool(value):
return False
else:
return False
return True
print(check_values(f_response)) #False
print(check_values(t_response)) #True
print(check_values(response)) #False