如何从嵌套字典列表的tags字段中提取所有唯一值?
问题描述
需要从包含多层嵌套字典的列表中,提取所有层级字典里tags字段的唯一值。
示例数据
data = [{ "name": "name1", "status": "one", "tags": ["tag11","tag4"], "child": [{ "name": "name2", "status": "two", "child": [{ "name": "name3", "status": "three", "tags": ["tag1","tag512"], "child": [{ "name": "name3", "status": "four", "tags": ["tag22","tag4"], "child": [] }] }], }] }, { "name": "name2", "status": "one", "tags": ["tag1","tag33"], "child": [{ "name": "name3", "status": "four", "child": [[{ "name": "name3", "status": "four", "tags": ["tag221","tag4"], "child": [] }]] }] } ]
尝试过的代码(仅能提取顶层tags)
def tags(data): tags = [] for item in data: for values in item.get('tags', []): if values not in tags: tags.append(values) print(tags) tags(data)
期望输出
包含所有层级tags字段的唯一值列表:["tag11","tag4","tag1","tag512","tag22","tag33","tag221"]
解决方案
要处理多层嵌套结构,需用递归遍历的方式,同时兼容child字段可能出现的列表嵌套情况:
高效去重版本(使用集合)
def collect_unique_tags(items): unique_tags = set() # 集合自动去重,效率高于列表判断 def traverse(element): if isinstance(element, dict): # 提取当前字典的tags if 'tags' in element: unique_tags.update(element['tags']) # 递归处理child字段 if 'child' in element: traverse(element['child']) elif isinstance(element, list): # 遍历列表中所有元素,递归处理 for item in element: traverse(item) traverse(items) # Python3.7+集合保留插入顺序,转列表即可 return list(unique_tags) # 调用示例 result = collect_unique_tags(data) print(result)
严格保留首次出现顺序版本
如果需要完全匹配期望输出的顺序,可改用列表+判断去重:
def collect_unique_tags(items): unique_tags = [] def traverse(element): if isinstance(element, dict): # 提取当前字典的tags,仅保留未出现过的 for tag in element.get('tags', []): if tag not in unique_tags: unique_tags.append(tag) # 递归处理child字段 if 'child' in element: traverse(element['child']) elif isinstance(element, list): for item in element: traverse(item) traverse(items) return unique_tags # 调用示例 result = collect_unique_tags(data) print(result)
代码说明
- 递归函数
traverse会遍历所有层级的元素:- 遇到字典时,提取
tags并处理child字段 - 遇到列表时,逐个遍历列表内的元素继续递归
- 遇到字典时,提取
- 集合版本效率更高,列表版本严格保留tags首次出现的顺序,两种方式均可得到符合要求的结果
内容的提问来源于stack exchange,提问作者Perl_Newbie
相关产品推荐
相关产品推荐

