Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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_Python 2.7 - Fatal编程技术网

Python 如何检查嵌套级别可变的字典中的所有值是否真实?

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":

我调用的各种API端点返回各种复杂度的响应对象,我需要通过未知级别的列表和/或字典嵌套数据结构进行解析

例如,如果我返回一个响应并在此处将json转换为字典:

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