首页 > 编程语言 > 详细

Python数据结构-数组

时间:2020-05-23 21:15:55      阅读:60      评论:0      收藏:0      [点我收藏+]

2020/5-20

一个有趣的问题

list = []

list[0] = 1

报错,说是索引超出了范围range

为什么会这样?

因为我们定义的列表的长度就是0,使用索引当然失败

可以使用 .append(),就不会报错

如果我想使用索引来增加末尾的元素呢?

list = [0,1,2]

list.append(None)

list[3] = 3

如果想使用索引,前提是该位置必须存在

 

数组

什么是数组?

array,有限个相同类型 的变量组成的有序集合

  1. 有限,数组是有限的

  2. 相同类型,数组中的元素是同种类型的

  3. 有序,数组在内存中是顺序存储的

在Python中列表和元组就是对数组的封装

数组的基本操作(在Python中就是list呗)

读取操作

对于列表使用索引法就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()
?

扩展:如果是删除元素呢?

相关的有三个方法:

  1. .pop([index])

    如果没有index,那么默认弹出最后一位,返回值就是弹出值

  2. del list[index] (这个不是方法)

    del 这个可以删除列表本身,也可以删除某一位,没有返回值,且彻底删除

  3. .remove(obj)

    删除遇到的第一个obj,如果列表有复数的obj,那么意味着要用for循环删干净

    扩展一下,list.count(obj),返回obj在列表中出现的次数

    for i in range(list.count(obj)):list.remove(obj)

 

删除元素

辨析:

数组的插入是从后往前挪腾元素,然后空出位置给新元素;

类似的,删除元素也需要挪腾元素,只不过这次是来补位,把删掉元素空出来的位置补掉

Python中方法

.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()

 

Python数据结构-数组

原文:https://www.cnblogs.com/wb-Hopen/p/12944168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!