Python中enumerate遍历二维数组失效但range(len())可正常运行?
问题成因
报错的核心原因是对enumerate()的返回逻辑理解有误:
- 你写的
range(len())版本中,for i in range(len(array))迭代得到的i是纯整数类型的行索引,自然可以直接作为下标访问array[i]、board[i][j]。 - 但
enumerate()迭代任意可迭代对象时,每次返回的是**(索引, 对应位置元素)格式的二元组**,不是单独的整数索引。你写的for i in enumerate(array)中,i拿到的是类似(0, [1,2,3])、(1, [4,5,6])的元组,根本不是合法的列表下标值,执行array[i]时会直接触发TypeError: list indices must be integers or slices, not tuple错误。 - 内层循环的逻辑有同样的问题:就算外层不报错,
for j in enumerate(array[i])拿到的j也是元组,同样不能作为列下标使用。
正确使用enumerate遍历二维数组的方法
根据你是否需要用到索引,选对应写法即可:
不需要索引,仅访问元素值
不需要调用enumerate,直接按行迭代即可,写法最简洁:
for row in array: for val in row: print(val)
需要同时拿到行索引、列索引和对应值
这是enumerate最适合的场景,注意要把返回的元组拆包为「索引变量」和「元素变量」两部分:
# i为行索引,row为当前行对应的一维数组 for i, row in enumerate(array): # j为列索引,val为当前坐标对应的元素值 for j, val in enumerate(row): # 如果需要访问同坐标下board的元素,直接用i、j作为下标即可 print(board[i][j]) # 访问当前array的元素直接用val即可,不需要再写array[i][j] # print(val)
小提示:enumerate的设计初衷就是减少手动通过索引取值的冗余代码,只要记住「用enumerate就拆包接索引和值」的规则,就不会和
range(len())的写法混淆,代码可读性也会比纯索引遍历更高。
内容的提问来源于stack exchange,提问作者Cheesewaffle
相关产品推荐
相关产品推荐

