如何提取未知层级的列表与字典中的字符串值?
提取嵌套结构中的所有字符串值
需求说明
我有一批结构未知的数据,仅明确由列表(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']
这种方式最优雅,全程递归处理,只收集目标字符串,不需要额外的后续处理。
方法二:复用已有辅助函数
如果想基于你现有的函数实现,可以分三步处理:
- 用
traverse遍历所有键值对,提取所有值 - 用
flatten扁平化所有嵌套列表 - 过滤出其中的字符串类型数据
代码实现:
# 提取所有值 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
相关产品推荐
相关产品推荐

