【问题标题】:How do I check that all values in a dictionary with variable levels of nesting are truthy or falsey?如何检查具有可变嵌套级别的字典中的所有值是真还是假?
【发布时间】:2018-08-16 23:57:49
【问题描述】:

我调用了各种 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,因为 None 是嵌套列表中的项目

标签: python python-2.7


【解决方案1】:
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

【讨论】:

  • 啊……谢谢!这个解决方案对我有用,而且更优雅。
  • @JeffreyLee 请检查我所做的更改,以免在某些情况下输出错误。
  • 是的,看来我说得太早了,我尝试了以下方法,但它不起作用:response = { "key1": {"foobar": ["a", "b", {"xyz": 123}]}, "key2": "value2", "key3": "value3", "key4": [ [4, 5, 6], [[[[[[[[[[[[[[[[[[[["hi"]]]]]]]]]]]]]]]]]]]] ], "key5": "value4", "key6": ["value5", [[[True, [False]]]]], "key7": { "key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4", "key5": "value5", "key6": "value6" }, "key8": ["value6", {"one": 1}, "should work now"] }
  • @JeffreyLee 将 False 作为输出,因此它可以正常工作吗?
  • 不,因为我在那个可笑的嵌套列表组中有字符串“hi”而不是空字符串
猜你喜欢
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2020-07-05
  • 2023-03-02
  • 2019-12-24
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多