Python遍历二维数组做文本切片时第二列索引失效问题
问题根因
该问题和NumPy无关,是典型的Python缩进错误,不需要引入第三方库即可修复。
Python通过缩进判定代码块归属,你贴出的修改后代码存在明显的缩进错位:
- 循环内读取
project_id、project_text并打印原始值的代码缩进正确,属于每次迭代都会执行的逻辑,因此你能看到project_id随索引正常递增输出 - 文本截断的
if/else逻辑、以及截断后内容的打印代码缩进层级和循环体不一致,解释器判定这部分代码不属于for循环的迭代块:trunc_proj_text仅在第一次循环时被赋值为第一行文本的截断结果,后续迭代不会更新该变量值,因此最终会重复输出40次第一行的截断结果。
这种缩进错位通常是写代码时混用Tab键和空格、手动调整缩进时对齐不一致导致的,和数组索引、切片逻辑没有关系,你之前查的NumPy数组遍历、列表切片相关内容和当前场景不匹配。
修复方案
- 统一代码缩进,Python官方推荐每级缩进使用4个空格,禁止Tab和空格混用。修复后的可运行代码如下:
# 原数组追加逻辑无需改动 # project_information.append([proj_id, project_text]) for i in range(len(project_information)): # 循环内所有代码保持同一缩进层级 project_id = project_information[i][0] project_text = project_information[i][1] print(project_id) print(project_text) if len(project_text) > 5000: trunc_proj_text = project_text[:1000] else: trunc_proj_text = project_text print(project_id) print(trunc_proj_text)
- 更稳妥的写法是直接对二维列表做解包遍历,省去手动维护索引的步骤,从写法上减少索引错误、缩进错误的概率:
for project_id, project_text in project_information: print(project_id) print(project_text) # 截断逻辑可以简化为三元表达式 trunc_proj_text = project_text[:1000] if len(project_text) > 5000 else project_text print(project_id) print(trunc_proj_text)
补充说明:不建议针对当前场景使用NumPy,NumPy数组处理变长字符串时会自动做类型对齐,反而会出现文本截断、类型转换异常的问题,用原生列表遍历是效率最高、适配性最好的方案。
内容的提问来源于stack exchange,提问作者Rose_Trojan
相关产品推荐
相关产品推荐

