Python遍历动态嵌套列表时出现类型报错的问题咨询
问题原因
你遇到的两个报错本质都是动态生成嵌套列表Z时,不同分支返回的结构层级不统一:
- 保留
[Arr1[i]]外层括号时,未匹配Arr3的分支返回的是[单个数值]结构,匹配Arr3的分支返回的Arr2元素本身是列表,最终Z的元素会出现两层嵌套(比如[[14,6]]),遍历Z[0]时拿到的是子列表而非数值,传入func后运算结果类型不匹配,触发列表和float无法拼接的报错。 - 去掉
[Arr1[i]]外层括号时,未匹配Arr3的分支直接返回单个数值,此时Z[0]是float类型,无法直接遍历,触发不可迭代报错。
修复方案
方案1:统一Z的生成规则(推荐)
调整列表推导式的两个分支,保证Z的每个元素永远是一维列表,从根源避免结构不一致的问题:
Arr1 = [9,7,3,1] Arr2 = [[14,6],[13,2]] Arr3 = [0,2] arr3_set = set(Arr3) # 匹配Arr3时返回Arr2对应列表,未匹配时返回包裹单个数值的列表,两者结构统一为一维列表 Z = [Arr2[Arr3.index(i)] if i in arr3_set else [Arr1[i]] for i in range(len(Arr1))] # 如需保留numpy object数组格式,可再加一行: # import numpy as np # Z = np.array(Z, dtype=object)
修改后:
- 当Arr3有值时,Z结构为
[[14,6], [7], [13,2], [1]],Z[0] =[14,6]可直接遍历 - 当Arr3为空时,Z结构为
[[9], [7], [3], [1]],Z[0] =[9]可直接遍历,不会出现单个数值的情况
方案2:兼容遍历逻辑
如果不想调整Z的生成代码,可在遍历时增加类型判断,自动扁平化嵌套的列表元素:
import numpy as np result = func(5) for item in Z[0]: # 判断当前元素是否为列表/数组类型,是则遍历内层元素 if isinstance(item, (list, np.ndarray)): for z in item: result += func(z) else: # 单个数值直接调用func result += func(item)
内容的提问来源于stack exchange,提问作者Melanie
相关产品推荐
相关产品推荐

