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

从含列表、元组、集合、字典的复合列表中提取全部数值

问题需求

从给定复合列表list1中提取所有数值(包含字典的键和值中的数值),list1定义如下:

list1 = [1,2,3,4, [44,55,66, True], False, (34,56,78,89,34), {1,2,3,3,2,1}, {1:34, "key2": [55, 67, 78, 89], 4: (45, 22, 61, 34)}, [56, 'data science'], 'Machine Learning']

预期提取结果为:

n = [1,2,3,4,44,55,66,34,56,78,89,34,1,2,3,1,34,55,67,78,89,4,45,22,61,34,56]

现有prod_list函数无法正确提取所有目标数值,需修正代码实现需求。

原代码问题分析

原函数存在以下缺陷:

  • 处理字典时仅遍历键,但未提取键中的数值;同时处理字典值时,仅支持有限的嵌套类型(列表/元组),未覆盖集合等结构,也未递归处理深层嵌套。
  • 未采用递归逻辑,无法处理任意深度的嵌套结构(如列表嵌套列表嵌套元组的情况)。
  • 对字典的处理逻辑不完善,遗漏了字典键的数值提取。
修正后的代码

采用递归方式实现,可处理任意深度的嵌套结构,同时覆盖所有需要提取数值的场景:

def prod_list(lst):
    flat_list = []
    
    def extract_values(item):
        # 排除布尔值,因为bool是int的子类,需单独判断
        if isinstance(item, (int, float)) and not isinstance(item, bool):
            flat_list.append(item)
        # 处理列表、元组、集合
        elif isinstance(item, (list, tuple, set)):
            for elem in item:
                extract_values(elem)
        # 处理字典,同时提取键和值中的数值
        elif isinstance(item, dict):
            for key, value in item.items():
                extract_values(key)
                extract_values(value)
    
    extract_values(lst)
    return flat_list

# 测试代码
list1 = [1,2,3,4, [44,55,66, True], False, (34,56,78,89,34), {1,2,3,3,2,1}, {1:34, "key2": [55, 67, 78, 89], 4: (45, 22, 61, 34)}, [56, 'data science'], 'Machine Learning']
result = prod_list(list1)
print(result)
# 输出与预期结果一致:[1,2,3,4,44,55,66,34,56,78,89,34,1,2,3,1,34,55,67,78,89,4,45,22,61,34,56]
代码说明
  • 内部定义extract_values递归函数,负责遍历并提取每个元素的数值。
  • 对数值类型判断时,排除布尔值(因为bool是int的子类,isinstance(True, int)会返回True,需单独过滤)。
  • 针对列表、元组、集合,递归遍历每个元素;针对字典,分别递归处理键和值,确保所有嵌套层级的数值都被提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:31:22