从含列表、元组、集合、字典的复合列表中提取全部数值
问题需求
从给定复合列表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
相关产品推荐
相关产品推荐

