You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从嵌套字典列表的tags字段中提取所有唯一值?

提取多层嵌套字典列表中所有层级的唯一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:39:36