一、课程目标
- array.array的使用
- array与list区别
- array相关操作时间复杂度
详情解读
- 内置array类型:
array创建实例
from array import array
myarray1=array('i',[1,2,3,4])
myarray2=array('u',['a','b','c'])
- array模块:
array.array类型特点
1.成员只能是字符、整数、浮点数类型
2.所有成员必须是统一的类型
3.可能通过array.typecodes查看类型码
array.typecodes:
import sys
import array
myarray1=array.array('i',[1,2,3,4])
myarray2=array.array('i',{1,2,3,4})
myarray3=array.array('I',{1,2,3,4})
myarray4=array.array('i',range(10))
myarray5=array.array('q',{1:10,2:20,3:30,4:40})
myarray6=array.array('u',{'a':10,'b':20,'c':30,'d':40})
myarray7=array.array('u','string')
print(myarray1)#array('i', [1, 2, 3, 4])
print(myarray2)#array('i', [1, 2, 3])
print(myarray3)#array('I', [1, 2, 3, 4])
print(myarray4)#array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(myarray5)#array('q', [1, 2, 3, 4])
print(myarray6)#array('u', 'abcd')
print(myarray7)#array('u', 'string')
print('*'*20)
#1.统计、插入、弹出、删除、反转、添加数组、获取最小index
print(myarray1.count(10))#0
myarray1.insert(1,5)
print(myarray1)#array('i', [1, 5, 2, 3, 4])
myarray1.pop(3)
print(myarray1)#array('i', [1, 5, 2, 4])
myarray1.remove(4)
print(myarray1)#array('i', [1, 5, 2])
'''
myarray1.extend(myarray3)
print(myarray1)
can only extend with array of same kind
只能用同类数组扩展
这里如果用myarray2代替myarray3就不会报错了
'''
print(myarray1.index(5))#1
print('*'*20)
#2.元素项大小
print(myarray1.itemsize)#4表示每个元素需要4个字节数
#其中i表示字符型的数字,字符型的数字第一位表示符号,只有4**8-1=31位用来表示数字的31位能表示的二进制最大的
#为2**31-1,因此下面这行代码会报错
#myarray1[0]=2**31 #OverflowError: Python int too large to convert to C long
#下面这行代码是正确的
myarray1[0]=2**31-1 #2147483647
print(myarray5.itemsize) #8
myarray5[0]=2**63-1
print(myarray5[0]) #9223372036854775807
print('*'*20)
#3.元素的类型
print(myarray1.typecode) #i
#4.以元组形式返回(对象内存地址,元素数量)
print(myarray1.buffer_info()) #(2844659051120, 3)
print(myarray4.buffer_info()) #(2844659311408, 10)
print('*'*20)
#5.从某个字节创建数组
myarray3=array.array('i',[])
myarray3.frombytes(b'luxp')
print(myarray3) #array('i', [1886942572])
print('*'*20)
#6.从某个文件创建数组
myarray3=array.array('i',[])
myarray3.fromfile(open('myarray_1.txt','rb'),4)
#myarray1.txt文件内容如下
'''
welcome to here\n
hello world\n
how are you
'''
print(myarray3) #array('i', [1668048247, 543518063, 1746956148])
print(myarray3.tobytes()) #b'welcome to here\r'
print(myarray3.itemsize) #4
#读取5个对象试试
myarray3=array.array('i',[])
myarray3.fromfile(open('myarray_1.txt','rb'),5)
print(myarray3) #array('i', [1668048247, 543518063, 1746956148, 224752229, 1818585098])
print(myarray3.tobytes()) #welcome to here\rwelcome to here\r\nhel
print(len('welcome to here\r\nhel')) #20
print('*'*20)
#7.从列表中追加项目
myarray1.fromlist([10,20,30,40])
print(myarray1) #array('i', [2147483647, 5, 2, 10, 20, 30, 40])
#如果追加的项目类型不符合,则报错
'''
myarray1.fromlist(['a'])
an integer is required (got type str)
'''
print('*'*20)
#8.对数组的每一项进行字节对调
print(myarray3.tobytes()) #b'welcome to here\r\nhel'
myarray3.byteswap()
print(myarray3.tobytes()) #b'welcome to here\r\nhel'
print('*'*20)
#9.写入文件
myarray3.tofile(open('myarray_2.txt','wb'))
print('*'*20)
#10.转换为普通列表
print(myarray1.tolist()) #[2147483647, 5, 2, 10, 20, 30, 40]
print('*'*20)
#11.将数组转换成为unicode字符串
print(myarray7) #array('u', 'string')
print(myarray7[0]) #s
print(myarray7.buffer_info()) #(2627873033216, 6)
print(myarray7.tounicode()) #string
print('*'*20)
#12.比较内存大小
mylist=[i for i in range(10)]
print(sys.getsizeof(mylist)) #184
myarray=array.array('i',mylist)
print(sys.getsizeof(myarray))#104
print('*'*20)
array和list的区别
- 列表是指针数组
- 数组是值数组
- 在C语言中(cpython),数组都是由一段连续的内存空间组成,动态数组在运行中可以修改长度
列表的存储方式:
array的存储方式:
时间复杂度:
数组的时间复杂度:
时间复杂度O表示法:在计算机中执行程序,都需要耗费CPU一定的运算时间,有的时候耗费时间与数据量存在关系,可能是线性关系,对数关系,指数关系,衡量这种关系通常用一种称为O(n)的方法
比如:O(1),就是表示,不管多少数据,操作的时间都是与1个数据一样。O(n),就是表示,随着数据量增加(n在增加),那么所耗的时间也随着增加n倍
数组各项操作时间复杂度
操作 | 复杂度 |
---|---|
从第i个位置访问 | O(1) |
在第i个位置替换 | O(1) |
从末尾插入数据 | O(1) |
从末尾删除 | O(1) |
从第i个位置插入 | O(n) |
增加容量 | O(n) |
减少容量 | O(n) |