TypeError: list indices must be integers or slices, not tuple

一直以为列表的操作很简单,直到自己读取列表某一行和某一列时才发现问题,可以发现在python中,普通的列表list和numpy中的数组array是不一样的,最大的不同是:一个列表中可以存放不同类型的数据,包括int、float和str,甚至布尔型;而一个数组中存放的数据类型必须全部相同,int或float。

在list中数据类型保存的是数据的存放地址,简单的说就是指针,并非数据,这样保存一个list很麻烦了,例如list1=[1,2,3,4]需要4个指针和四个数据,增加了存储和消耗cpu,而array1=numpy.array([1,2,3,4])只需要存放四个数据,读取和计算更加方便,因此在做纯数字操作时,建议使用array

因为列表可以存放不同类型的数据,因此列表中每个元素的大小可以相同,也可以不同,也就不支持一次性读取一列,即使是对于标准的二维数字列表,例如定义数组列表如下:

a = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
print(a[0])  # 可以取出列表a的第一行

[1, 2, 3, 4]

当尝试使用数组的方法读取一列时失败

a = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
print(a[:,0])
TypeError: list indices must be integers or slices, not tuple

我们需要用列表解析的方法读取一列:

a = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
c=[x[0] for x in a]
print(c)

[1, 5, 9, 13]

而对于数组,就简单的多,可以直接读取:

import numpy as np
a = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])
print(a[:,0])

[ 1  5  9 13]

当然存在必然有其价值,列表在混合数据中的作用也无可替代

上一篇:线段树 POJ - 3468 A Simple Problem with Integers


下一篇:Android GUI系统之SurfaceFlinger(06)服务端分析1-处理VSYNC