使用具有多个结构的字典中的子字符串到达叶子
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',但数量不多。如果有多滴,我可以手动调整取哪一个。
我试图展平,但展平后每个字典项目都有不同的键名。
我还想获取其他信息,但这些属性中的大多数也有类似的问题。
我想获取 drop
、dropped
和 is_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]
我有这样一个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',但数量不多。如果有多滴,我可以手动调整取哪一个。
我试图展平,但展平后每个字典项目都有不同的键名。
我还想获取其他信息,但这些属性中的大多数也有类似的问题。
我想获取 drop
、dropped
和 is_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]