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

9 篇文章 0 订阅

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]))

注意输出形式,可见list tuple都是一行。 ndarray是两行才是真正的矩阵或2维结构,用[i,j]索引才可行
可以明显发现:

  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有不少小注意点,使用中才能感受深刻,所以注意多用、多思,多总结。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值