使用具有多个结构的字典中的子字符串到达​​叶子

Reaching a leaf using substring in a dictionary with multiple structures

我有这样一个json文件,它结合了所有以前的数据存储版本。一个例子是这样的:

myList = {1: {'name': 'John', 'age': '27', 'class'= '2', 'drop' = True},
          2: {'name': 'Marie', 'other_info': {'age': '22', 'class'= '3', 'dropped'= True }},
          3: {'name': 'James', 'other_info': {'age': '23', 'class'= '1', 'is_dropped'= False}},
          4: {'name': 'Lucy', 'some_info': {'age': '20', 'class'= '4', 'other_branch': {'is_dropped' = True, 'how_drop'= 'Foo'}}}}

我想访问键或子键中包含 drop 的信息。我不知道所有的字典结构,可能有20个或更多。我所知道的是它们都包含短语 'drop'。可能还有其他短语也可能包含短语 'drop',但数量不多。如果有多滴,我可以手动调整取哪一个。

我试图展平,但展平后每个字典项目都有不同的键名。

我还想获取其他信息,但这些属性中的大多数也有类似的问题。

我想获取 dropdroppedis_dropped 键中的 True, True, False, True 值。

我怎样才能到达这个节点?

创建一个递归函数来搜索并添加到增量键。在不进行安全检查的情况下,您可以这样做:

def find(input_dict, base='', search_key='drop'):
   found_paths = []
   if search_key in input_dict.keys():
      found_paths.append(base)
   for each_key in input_dict.keys():
      if isinstance(input_dict[each_key], dict):
         new_base = base + '.' + each_key
         found_paths += find(input_dict[each_key], base=new_base, search_key=search_key)
   return found_paths

你可以使用递归来解决这个问题:

def get_drop(dct):
    for key, val in dct.items():
        if isinstance(key, str) and 'drop' in key and isinstance(val, bool):
            yield val
        elif isinstance(val, dict):
            yield from get_drop(val)

print(list(get_drop(myList)))

[True, True, False, True]