gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:55 25 4
gpt4 key购买 nike

这个很棘手......关于如何遍历树有很多问题和答案,但我无法根据我的特殊情况调整任何建议的解决方案。我的问题非常接近 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']}]}]

我的目标是通过匹配“名称”和“同义词”来过滤这棵树。必须保留匹配项的分支层次结构:第 3 层的匹配子项意味着第 1 层和第 2 层的父项也被保留(但不是子项)。

例如,使用 filterterms=['literature', 'agriculture'] 应该会产生以下过滤树:

[{'id': 20, 'name': 'education', 'subterms': [
{'id': 22,'name': 'schoolbooks', 'synonyms': ['literature']}]},
{'id': 1, 'name': 'business', 'subterms': [{'id': 2, 'name': 'industry',
'subterms': [{'id': 21, 'name': 'agriculture', 'synonyms': []}],
'synonyms': []}]}]

到目前为止,我在 n 级遍历树并保留匹配项的分支层次结构的所有尝试都以失败告终……对我如何解决此任务有任何帮助吗?

最佳答案

我认为这可以满足您的需求。

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']))

结果:

[{'id': 1, 'name': 'business', 'subterms': []}]
[{'id': 20,
'name': 'education',
'subterms': [{'id': 22,
'name': 'schoolbooks',
'subterms': [],
'synonyms': ['literature']}]}]
[{'id': 20,
'name': 'education',
'subterms': [{'id': 22,
'name': 'schoolbooks',
'subterms': [],
'synonyms': ['literature']}]},
{'id': 1,
'name': 'business',
'subterms': [{'id': 2,
'name': 'industry',
'subterms': [{'id': 21,
'name': 'agriculture',
'subterms': [],
'synonyms': []}],
'synonyms': []}]}]

关于python - 如何过滤嵌套的 JSON 并保留匹配的分支层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29561835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com