Python中for循环处理三维numpy数组生成列表的列表问题
解决嵌套列表的循环计算适配问题
先说说你代码里的核心问题:你写的for i in list(range(len(expected[i]))):犯了两个关键错误:
- 变量
i在循环启动前根本没定义,直接用expected[i]会立刻抛出索引错误; - 循环层级逻辑完全错配——你的
expected是两层嵌套列表(外层有2个元素,每个元素是一个子列表,子列表里才是要计算的三元组),你需要先遍历外层的每个子列表,再遍历子列表里的单个元素。
正确的嵌套循环实现
我们用两层for循环来匹配原数组的结构,确保不管外层/内层列表长度怎么变,代码都能适配:
import numpy as np expected = [[[45.0, 10.0, 10.0], [110.0, 10.0, 8.0], [60.0, 10.0, 5.0], [170.0, 10.0, 4.0]], [[-80.0, 20.0, 10.0], [97.0, 15.0, 12.0], [5.0, 20.0, 8.0], [93.0, 10.0, 8.0], [12.0, 5.0, 15.0], [-88.0, 10.0, 10.0], [176.0, 10.0, 8.0]]] horizontal_expected = [] # 第一层循环:遍历外层的每个子列表 for sub_list in expected: sub_result = [] # 第二层循环:遍历当前子列表里的每个三元组元素 for elem in sub_list: # 拆解元素让逻辑更清晰,也可以直接用索引计算 angle_deg = elem[0] val1 = elem[1] val2 = elem[2] horizontal_exp = val1 * val2 * np.cos(np.deg2rad(angle_deg)) sub_result.append(horizontal_exp) # 将当前子列表的计算结果加入最终列表 horizontal_expected.append(sub_result) print(horizontal_expected)
更简洁的列表推导式写法
如果喜欢紧凑代码,可以用嵌套列表推导式,逻辑和上面的循环完全一致:
import numpy as np expected = [[[45.0, 10.0, 10.0], [110.0, 10.0, 8.0], [60.0, 10.0, 5.0], [170.0, 10.0, 4.0]], [[-80.0, 20.0, 10.0], [97.0, 15.0, 12.0], [5.0, 20.0, 8.0], [93.0, 10.0, 8.0], [12.0, 5.0, 15.0], [-88.0, 10.0, 10.0], [176.0, 10.0, 8.0]]] horizontal_expected = [ [elem[1] * elem[2] * np.cos(np.deg2rad(elem[0])) for elem in sub_list] for sub_list in expected ] print(horizontal_expected)
结果说明
这两种写法都会生成和原数组结构完全对应的嵌套列表:
- 外层列表长度和
expected一致(2个元素); - 每个内层列表的长度和原数组对应位置的子列表长度完全匹配(第一个4个元素,第二个7个元素),完美适配任意长度的嵌套结构。
内容的提问来源于stack exchange,提问作者Lucy Brown
相关产品推荐
相关产品推荐

