如何过滤嵌套的JSON并为匹配项保留分支层次结构?

2024-10-04 07:32:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这个很棘手。。。关于如何遍历树,有许多问题和答案,但是我无法根据我的特殊情况调整任何建议的解决方案。我的问题非常接近Python: How can I filter a n-nested dict of dicts by leaf value?

我有一个特殊的嵌套结构(子项、同义词、名称、id)的JSON数据,它可以具有任意深度。在

tree=[{'id': 20, 'name': 'education', 'subterms': [
               {'id': 21, 'name': 'schools', 'synonyms': []},
               {'id': 22, 'name': 'schoolbooks', 'synonyms': ['literature']},
               {'id': 23, 'name': 'higher education', 'synonyms': ['university']},
               {'id': 25, 'name': 'conference', 'synonyms': ['lecture']}]},
 {'id': 26, 'name': 'health', 'subterms': [
               {'id': 27, 'name': 'health issues', 'synonyms': []},
               {'id': 28, 'name': 'nutrition', 'synonyms': []},
               {'id': 29, 'name': 'medicine', 'synonyms': []}]},
 {'id': 1, 'name': 'business', 'subterms': [{'id': 2,
                'name': 'industry',
                'subterms': [{'id': 21, 'name': 'service', 'synonyms': []},
                             {'id': 21, 'name': 'agriculture', 'synonyms': []}],
                'synonyms': []},
               {'id': 3, 'name': 'professions', 'synonyms': ['jobs']}]}]

我的目标是通过匹配“name”和“synonyms”来筛选此树。必须保留匹配项的分支层次结构:级别3上的匹配子项意味着级别1和级别2上的父项也被保留(但子项不保留)。在

例如,使用filterterms=['literature', 'agriculture']将生成以下筛选树:

^{pr2}$

我在n层上遍历树并为匹配项保留分支层次结构的所有尝试都以失败告终。。。你能帮我解决这个问题吗?在


Tags: 答案nameid层次结构分支情况级别synonyms
1条回答
网友
1楼 · 发布于 2024-10-04 07:32:08

我想这是你想要的。在

tree=[{'id': 20, 'name': 'education', 'subterms': [
               {'id': 21, 'name': 'schools', 'synonyms': []},
               {'id': 22, 'name': 'schoolbooks', 'synonyms': ['literature']},
               {'id': 23, 'name': 'higher education', 'synonyms': ['university']},
               {'id': 25, 'name': 'conference', 'synonyms': ['lecture']}]},
 {'id': 26, 'name': 'health', 'subterms': [
               {'id': 27, 'name': 'health issues', 'synonyms': []},
               {'id': 28, 'name': 'nutrition', 'synonyms': []},
               {'id': 29, 'name': 'medicine', 'synonyms': []}]},
 {'id': 1, 'name': 'business', 'subterms': [{'id': 2,
                'name': 'industry',
                'subterms': [{'id': 21, 'name': 'service', 'synonyms': []},
                             {'id': 21, 'name': 'agriculture', 'synonyms': []}],
                'synonyms': []},
               {'id': 3, 'name': 'professions', 'synonyms': ['jobs']}]}]

def filter_by_name(node, names):
    if isinstance(node, list):
        return filter(None, (filter_by_name(x, names) for x in node if x))
    subterms = filter(None, filter_by_name(node.get('subterms',[]), names))
    if set([node['name']]+node.get('synonyms',[])).intersection(names):
        return dict(node, subterms=subterms)
    if subterms:
        return dict(node, subterms=subterms)
    return None


from pprint import pprint
pprint(filter_by_name(tree, ['business']))
pprint(filter_by_name(tree, ['literature']))
pprint(filter_by_name(tree, ['literature', 'agriculture']))

结果:

^{pr2}$

相关问题 更多 >