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

如何提取未知层级的列表与字典中的字符串值?

提取嵌套结构中的所有字符串值

需求说明

我有一批结构未知的数据,仅明确由列表(list)、字典(dict)和字符串(string)组合而成。希望提取其中所有的字符串值(包括列表中的值、字典中的值以及纯字符串值)并存储到一个列表中。

示例数据

d = {
    'key1': {
        'key2': {
           'key3': [
              {'key4': 'val1', 'key5': 'val2'}, {'key6': 'val3', 'key7': 'val4'}, 
              {'key8': 'val5', 'key9': 'val6'}, {'key10': 'val7', 'key11': 'val8'},
              'val9',                
           ]
        }, 
        'key12': 'val10'
    }
}

注:最低层级的字典下还可能嵌套其他列表。

已有的辅助函数

def traverse(value, key=None):
    if isinstance(value, dict):
        for k, v in value.items():
            yield from traverse(v, k)
    else:
        yield key, value

def flatten(_2d_list):
    flat_list = []
    for element in _2d_list:
        if type(element) is list:
            for item in element:
                flat_list.append(item)
        else:
            flat_list.append(element)
    return flat_list

问题

是否可以通过递归等优雅方式实现上述需求?


解决方案

方法一:极简递归生成器

直接写一个递归函数,遍历所有嵌套结构,遇到字符串就返回,遇到容器就继续递归遍历:

def extract_strings(data):
    if isinstance(data, str):
        yield data
    elif isinstance(data, list):
        for item in data:
            yield from extract_strings(item)
    elif isinstance(data, dict):
        for val in data.values():
            yield from extract_strings(val)

使用时直接转成列表即可:

result = list(extract_strings(d))
print(result)
# 输出:['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8', 'val9', 'val10']

这种方式最优雅,全程递归处理,只收集目标字符串,不需要额外的后续处理。

方法二:复用已有辅助函数

如果想基于你现有的函数实现,可以分三步处理:

  1. 用traverse遍历所有键值对,提取所有值
  2. 用flatten扁平化所有嵌套列表
  3. 过滤出其中的字符串类型数据

代码实现:

# 提取所有值
all_values = [v for _, v in traverse(d)]
# 扁平化嵌套列表
flattened_values = flatten(all_values)
# 过滤字符串
result = [val for val in flattened_values if isinstance(val, str)]
print(result)
# 输出与上述方法一致

内容的提问来源于stack exchange,提问作者DevB2F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:35:14