list = []
list[0] = 1
为什么会这样?
因为我们定义的列表的长度就是0,使用索引当然失败
可以使用 .append(),就不会报错
如果我想使用索引来增加末尾的元素呢?
list = [0,1,2]
list.append(None)
list[3] = 3
如果想使用索引,前提是该位置必须存在
什么是数组?
array,有限个相同类型 的变量组成的有序集合
有限,数组是有限的
相同类型,数组中的元素是同种类型的
有序,数组在内存中是顺序存储的
在Python中列表和元组就是对数组的封装
对于列表使用索引法就OK了
直接使用索引,赋值即可
尾部插入
使用方法 .append()
中间插入
使用方法 .insert()
超范围插入
当数组已经满了,但是还是想要插入元素,这个时候就是所谓的超范围插入
使用列表方法并没有问题
尾部插入和中间插入的区别:
尾部插入直接在列表最后增加位置,并赋值即可;如果列表长度足够,那么一开始就不用增加位置,直接赋值即可
中间插入:插入的位置(包括该位置)后的所有元素后移一位,然后直接赋值即可;如果长度不够,也就是超范围了,那么要么加一位,要么简单点直接倍增元素
尾部插入的代码实现
class MyArray:
def __init__(self,capacity):
self.array = [None]*capacity# 初始化列表,长度为4
self.size = 0# 列表有效元素的长度,刚开始就是零
?
def insert(self,index,sth):
if index < 0 or index > self.size:# 插入位置越界,抛出
raise Exception# 这里注意一个点,插入也是只能插入有效的位置才行,比如长度=0只能在0处插入
else:
for i in range(self.size-1,index-1,-1):# 从最后一位到插入位置(包括该位置),后移一位
self.array[i+1] = self.array[i]
self.array[index] = sth# 对该位置直接赋值
self.size += 1# 列表有效元素实际长度加1
?
def output(self):# 输出列表
print(len(self.array))
for i in range(0,self.size,1):
print(self.array[i],end=" ")
?
array = MyArray(4)# 实例化
array.insert(0,10)# 插入
array.insert(0,9)
array.insert(1,7)
array.insert(2,8)
# 这里只能先在0处插入,然后可以在0.1处插入,然后可以在0.1.2处插入。最多插入四个,因为插入四个之后,数组就# 满了。那么如何超范围插入呢?
?
array.output()
中间插入代码实现
class MyArray():
def __init__(self,capacity):
self.array = [None]*capacity
self.size = 0
?
def insert_v2(self,index,element):
if index < 0 or index > self.size:# 如果越界,抛出
raise Exception
elif self.size >= len(self.array):# 如果实际长度大于列表长度,重新为列表分配空间
self.resize()# 1. 使用函数倍增数组空间
# self.array.append(None)# 2. 使用方法仅增加需要的一位空间
for i in range(self.size-1,-1,-1):# 从最后一位到插入位置(包括该位置),后移一位
self.array[i+1] = self.array[i]
?
self.size += 1# 实际长度加1
self.array[index] = element# 插入位置直接赋值
?
def resize(self):
array_new = [None]*len(self.array)*2# 简单粗暴方式,那就是如果我列表长度不够,直接扩大两倍
for i in range(self.size):
array_new[i] = self.array[i]# 依次复制
?
self.array = array_new# 列表是对象传递,self.array指向新的列表对象
?
def out_put(self):
for i in range(len(self.array)):
print(self.array[i],end=" ")
?
?
array = MyArray(4)
array.insert_v2(0,0)
array.insert_v2(0,1)
array.insert_v2(0,2)
array.insert_v2(0,3)
array.insert_v2(0,4)
array.insert_v2(1,0)
# 诚然,直接加倍是简单粗暴的方式,还有一种重新分配空间的方式,那就是直接使用.append这个方法,超出之后就每# # 加个数就扩容一次,见上面注释掉的部分
?
array.out_put()
?
扩展:如果是删除元素呢?
相关的有三个方法:
.pop([index])
如果没有index,那么默认弹出最后一位,返回值就是弹出值
del list[index] (这个不是方法)
del 这个可以删除列表本身,也可以删除某一位,没有返回值,且彻底删除
.remove(obj)
删除遇到的第一个obj,如果列表有复数的obj,那么意味着要用for循环删干净
扩展一下,list.count(obj),返回obj在列表中出现的次数
for i in range(list.count(obj)):list.remove(obj)
数组的插入是从后往前挪腾元素,然后空出位置给新元素;
类似的,删除元素也需要挪腾元素,只不过这次是来补位,把删掉元素空出来的位置补掉
.pop([index])
del
.remove(obj)
class MyArray():
def __init__(self,capacity):
self.array = [None]*capacity
self.size = 0
?
def insert_v2(self,index,element):
if index < 0 or index > self.size:# 如果越界,抛出
raise Exception
elif self.size >= len(self.array):# 如果实际长度大于列表长度,重新为列表分配空间
# self.resize()
self.array.append(None)
for i in range(self.size-1,index-1,-1):# 从最后一位到插入位置(包括该位置),后移一位
self.array[i+1] = self.array[i]
?
self.size += 1# 实际长度加1
self.array[index] = element# 插入位置直接赋值
?
def resize(self):
array_new = [None]*len(self.array)*2
for i in range(self.size):
array_new[i] = self.array[i]
?
self.array = array_new
?
def romove(self,index):
if index < 0 and index > self.size:
raise Exception
else:
while index < self.size-1:# 从index到self.size-1-1
self.array[index] = self.array[index+1]
index += 1
self.size -= 1 # 实际长度-1
self.array.pop()# 弹出最后空缺的位置
?
def output(self):
for i in range(self.size):
print(self.array[i],end=" ")
?
c3 = MyArray(4)
?
c3.insert_v2(0,0)
c3.insert_v2(1,1)
c3.insert_v2(2,2)
c3.insert_v2(3,3)
c3.insert_v2(4,4)
c3.insert_v2(5,5)
?
print("数组如下:")
c3.output()
print("\n删除之后的是:")
c3.romove(1)
c3.output()
原文:https://www.cnblogs.com/wb-Hopen/p/12944168.html