《python全栈工程师 - 数据结构与算法》:数组

一、课程目标

  • array.array的使用
  • array与list区别
  • array相关操作时间复杂度

详情解读

  1. 内置array类型:
    array创建实例
from array import array
myarray1=array('i',[1,2,3,4])
myarray2=array('u',['a','b','c'])
  1. array模块:
    array.array类型特点

1.成员只能是字符、整数、浮点数类型
2.所有成员必须是统一的类型
3.可能通过array.typecodes查看类型码

array.typecodes:
Alt

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的区别

  1. 列表是指针数组
  2. 数组是值数组
  3. 在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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值