2017-09-15 61 views
0

我需要识别可能包含深层嵌套字典中的任何None值,该字典也可能包含列表。下面是我的代码,因为它现在存在。它可以工作,但它只返回与None值直接关联的密钥的名称。在嵌套字典中查找无值的位置

我想有指向None
(例如nested["top_key"]["next_key"]["final_key"])键的整个列表

def search_for_None(nested): 
    for key, value in nested.items(): 
     if isinstance(value, dict): 
      search_for_None(value) 
     elif isinstance(value, list): 
      for item in value: 
       if isinstance(item, dict): 
        search_for_None(item) 
     else: 
      if value is None: 
       logging.error("Missing value for key '{0}'".format(key)) 
+0

向您的问题添加示例输入数据,可以使其更清晰。 – Vanojx1

+1

你的递归方法很好,但你需要将当前的“路径”作为参数传递,或者用返回值逐位重新组合'None'的位置(比如'return [key] + returned_error_path_list') – Felk

回答

0

你需要传递的路径与递归调用一起。像下面

def search_for_None(nested, path): 
    for key, value in nested.items(): 
     dict_path = f"{path}[{key!r}]" 
     if isinstance(value, dict): 
      search_for_None(value, dict_path) 
     elif isinstance(value, list): 
      for index, item in enumerate(value): 
       list_path = f"{dict_path}[{index!r}]" 
       if isinstance(item, dict): 
        search_for_None(item, list_path) 
     else: 
      if value is None: 
       logging.error("Missing value for key '{0}'".format(dict_path)) 

path参数应该是一个字符串的东西(如“嵌套”)

另外请注意,您的评论(和我)的代码不会找到一个列表中的无值(例如{“a”:[None]}),因为没有检查这种情况。