遍历不规则数组需逐层识别结构、动态适配长度、避免硬编码维度假设;常用方法包括递归遍历、按行展开+动态索引、扁平化处理;numpy中需警惕object类型伪数组,应优先用for-in迭代并结合isinstance检查。

遍历不规则数组(如嵌套列表深度不一、子列表长度各异)时,不能直接依赖统一的 len() 或 range(len(...)),否则容易索引越界或漏项。关键在于**逐层识别结构、动态适配长度、避免硬编码维度假设**。
先判断是否为不规则嵌套结构
不规则数组常见于:JSON解析结果、爬虫提取的表格数据、用户输入的混合列表等。典型例子:
data = [[1, 2], [3, 4, 5], [6]] —— 子列表长度分别为 2、3、1,无法用二维矩阵方式遍历。
- 用
isinstance(x, list)检查每个元素是否为列表,避免对非列表元素调用len() - 打印各层长度辅助诊断:
[len(sub) if isinstance(sub, list) else 'not a list' for sub in data] - 警惕空列表:
[]的len()是 0,但继续遍历时需跳过或特殊处理
安全遍历嵌套列表的三种常用方式
-
递归遍历:适合任意深度,自动适配结构
示例:def walk(lst):<br> for item in lst:<br> if isinstance(item, list): walk(item)<br> else: print(item)
-
按行展开 + 动态索引:适用于“每行独立处理”场景
用for row in data:直接迭代外层,再对row单独调用len(row)和for i in range(len(row)): -
扁平化后处理:若只需所有叶子值(忽略层级)
可用生成器:def flatten(lst):<br> for item in lst:<br> if isinstance(item, list): yield from flatten(item)<br> else: yield item
然后for x in flatten(data): ...
与 NumPy 配合时的特别注意
NumPy 不原生支持不规则数组。若尝试将 [[1,2], [3,4,5]] 转为 np.array,会得到 dtype=object 的一维数组,此时 .shape 返回 (2,),而非你期望的二维形状。
- 不要用
arr.shape[1]获取列数——它会报错或返回意外结果 - 检查
arr.dtype == object是判断是否“伪数组”的快捷方式 - 真需要数值计算,应先对齐:补零(
np.pad)、截断(切片)、或转为 pandas Series(自动处理变长)
处理多维不规则数据的实用建议
- 优先用
for item in container:替代for i in range(len(container)):,减少索引管理负担 - 对每个子结构单独验证长度:
if hasattr(sub, '__len__') and len(sub) > 0: - 使用
try/except IndexError:包裹关键访问(尤其在解析不可信数据时),比预判更鲁棒 - 考虑改用字典或命名元组替代深度嵌套,提升可读性和可维护性











