TypeError: list indices must be integers or slices, not tuple问题,恼人的索引问题

TypeError: list indices must be integers or slices, not tuple问题,恼人的索引问题

  • 解决
  • 内探:分清楚嵌套列表和二维数据的概念

解决

糙猛快的[i,j] 改为[i][j], 原因是元组或列表(tuple,list)没有矩阵概念,只有嵌套。所以你不能用[i,j]像matlab等里面一样去二维索引一个list,只能用[i][j]这样相当于索引了两次,先索引外层[i]个列表,再索引内层第j个元素。(类似地,[i,j,k…]改为[i][j][k][…]就ok)
当然也可以将你的list或tuple改为numpy里面的array,就可以用 np.array(列表)[i,j]这种形式索引了。

内探:分清楚嵌套列表和二维数据的概念

# 元组/列表操作
aMat = tuple([[1,2,3],[2,3,4]]) #tuple
sl = slice(1) # slice
print("元组", aMat, "列表:",list(aMat)) # print(list(aMat))
print("索引tuple,list用 整数或slice: ", aMat[1], aMat[sl], "类型", type(aMat[1]), type(aMat[sl]),"数目", len(aMat[1]), len(aMat[sl]) )
print("引用双嵌套列表里面具体元素的是[i][j],非[i,j]:", aMat[1][2], aMat[sl][0],"类型",type(aMat[1][2]), type(aMat[sl][0]))
# nparray
aMat2 = np.array(aMat)
sl2 = slice(2)
print(aMat2)
print("索引 np用:整数或slice", aMat2[1], aMat2[sl2], "类型", type(aMat[1]), type(aMat2[sl2]),"数目", len(aMat2[1]), len(aMat2[sl2]) )
print("引用ndarray 里面具体元素的是[i,j]:", aMat2[1,2], aMat2[sl2, 2],"类型",type(aMat2[1,2]), type(aMat2[sl2,0]))

TypeError: list indices must be integers or slices, not tuple问题,恼人的索引问题_第1张图片
可以明显发现:

  1. 同样的一串2*3的矩阵,元组合list都是一行(区别元组为圆括号,list为方),而只有ndarray是真的2行的形式;
  2. 针对同样的元组类型,其切片slice和数字不太一样,slice切下来还是原本类型,索引一般丢弃一层“外壳”。
  3. len是简单数数,如slice切下来的就数为一个list成员;同样的list的len数下来才是真实的“元素、数据”个数。。。slcie使用要当心,numpy里最好用shape来显示维度。
  4. numpy里ndarray不是一种真正的“新”数据类型,而只是格式重排,将list分维度存储,便于利用。其本质类型和次级类型和lsit相似(但是比list省略了索引存储量,所以一般会节约存储空间)。

list和array有不少小注意点,使用中才能感受深刻,所以注意多用、多思,多总结。

你可能感兴趣的:(python,2019,编程基础,数据结构)