python dynamic array
用python 语言实现一个动态数组 类似于python内置的list
首先 必须
import ctypes
用于生成指定大小的数组
constructor, 生成一个初始容量为10,里面一个元素都没有的数组
#构造函数,创建了三个属性,分为用于指定初始容量,当前大小和当前数组 def __init__ (self): 'Create an empty array.' self._n = 0 #size self._capacity = 10 self._A = self._make_array(self._capacity)
实现__len__函数,此函数是用于 当你使用len()函数时,会调用__len__()函数
#构造函数中创建了_n属性来指定当前大小 def __len__ (self): return self._n
判空
# _n指定当前大小 def is_empty(self): return self._n == 0
获取当前数组中的某个元素
# 因为python的数组下标可以是负数,但是这边没有进行相应的实现,有兴趣的可以自行实现 def __getitem__ (self, k): if not 0 <= k < self._n: raise ValueError('invalid index') return self._A[k]
追加元素
def append(self, obj): #当数组当前元素已满时,扩充容量为原来的两倍,在进行追加 if self._n == self._capacity: self._resize(2 * self._capacity) self._A[self._n] = obj self._n += 1
创建数组和扩充数组
def _make_array(self, c): return (c * ctypes.py_object)( ) def _resize(self, c): B = self._make_array(c) #扩充之后,需要将原数组中的元素copy到新数组中 for k in range(self._n): B[k] = self._A[k] self._A = B self._capacity = c
在指定位置插入一个value
def insert(self, k, value): #当数组当前元素已满时,扩充容量为原来的两倍,在进行insert if self._n == self._capacity: self._resize(2 * self._capacity) for j in range(self._n, k, -1): self._A[j] = self._A[j-1] self._A[k] = value self._n += 1
将指定位置的元素删除
def pop(self,idx): if idx >= self._n: raise ValueError( 'index out of bounds' ) for i in range(idx,self._n - 1): self._A[i]=self._A[i+1] self._A[self._n - 1] = None self._n -= 1
删除指定value的元素(找到第一个就结束)
def remove(self, value): for k in range(self._n): if self._A[k] == value: for j in range(k, self._n - 1): self._A[j] = self._A[j+1] self._A[self._n - 1] = None self._n -= 1 return raise ValueError( 'value not found' )
打印数组中的元素
def _print(self): for i in range(self._n): print(self._A[i], end = ' ') print()
测试代码:
mylist = DynamicArray() print ('size was: ', str(len(mylist))) mylist.append(10) mylist.append(20) mylist.append(30) mylist.insert(0, 0) mylist.insert(1, 5) mylist.insert(3, 15) mylist._print() mylist.remove(20) mylist._print() print ('size is: ', str(len(mylist))) mylist.pop(3) mylist._print() print ('size is: ', str(len(mylist)))
测试输出
size was: 0 0 5 10 15 20 30 0 5 10 15 30 size is: 5 0 5 10 30 size is: 4