python实现数组
发布日期:2021-05-14 15:19:51 浏览次数:25 分类:精选文章

本文共 4260 字,大约阅读时间需要 14 分钟。

Python实现数组:数组类与常用操作说明

数据结构定义

一个完整的数据结构的定义应包含成员构造、增、删、改、查等基本操作,并提供返回大小及是否为空的功能。通过这样的设计,可以有效地管理和操作数组型数据集合。

难点分析

在实现一个基本的数组类时,主要难点在于细节处理,比如成员构造、数组动态调整、元素的增删查改以及异常处理等。

成员构造

类初始化时,需设置默认容量为100。通过这样的设定,可以方便地初始化数组实例。

def __init__(self, capacity=100):
self._capacity = capacity
self._size = 0
self._data = [None] * self._capacity

数组增操作

支持元素插入,位置可通过索引指定。此外,还提供了添加元素到末尾或开头的功能。

def add(self, index, elem):
if index < 0 or index > self._size:
raise Exception("Index is Illegal!")
if self._size == self._capacity:
self._resize(self._capacity * 2)
for i in range(self._size - 1, index - 1, -1):
self._data[i + 1] = self._data[i]
self._data[index] = elem
self._size += 1
def addFirst(self, elem):
self.add(0, elem)
def addLast(self, elem):
self.add(self._size, elem)

数组删操作

支持按索引删除元素,并提供删除开头或末尾元素的特定方法。删除操作还需处理数组拼接问题,确保数组在删除后能正确调整至初始状态。

def remove(self, index):
for i in range(index, self._size - 1):
self._data[i] = self._data[i + 1]
self._size -= 1
self._data[self._size] = None
if self._size and self._capacity // self._size == 4:
self._resize(self._capacity // 2)
return ret
def removeFirst(self):
self.remove(0)
def removeLast(self):
self.remove(self._size - 1)

数组改操作

允许指定索引位置修改元素值,直接赋值即可。

def set(self, index, elem):
if index < 0 or index > self._size:
raise Exception("Index is Illegal!")
self._data[index] = elem

数组查操作

支持逐个元素查找,返回特定索引的元素值。用户还可以通过getFirst和getLast方法分别获取数组首尾元素。

def get(self, index):
if index < 0 or index > self._size - 1:
raise Exception("Index is Illegal!")
return self._data[index]
def getFirst(self):
return self._data[0]
def getLast(self):
return self._data[self._size - 1]

数组查找操作

查找元素可通过线性搜索或高效算法实现。提供找一个元素的方法,以及找到所有元素索引的方法。

def find(self, elem):
for i in range(self._size):
if self._data[i] == elem:
return i
return -1
def findAll(self, elem):
res = Array()
for i in range(self._size):
if self._data[i] == elem:
res.addLast(i)
return res

数组大小与容量操作

提供一个获取当前数组大小的方法,以及获取最大容量的方法。此外,还可以通过方法查询数组是否为空。

def get_size(self):
return self._size
def get_capacity(self):
return self._capacity
def is_empty(self):
return self._size == 0

数组增大或缩小操作

提供动态调整数组大小的功能,当数组容量不足时自动扩展,或在元素稀疏时减少数组大小以优化空间使用。

def _resize(self, new_capacity):
self._capacity = new_capacity
newArray = Array(new_capacity)
for i in range(self._size):
newArray._data[i] = self._data[i]
self._data = newArray._data

附加功能

此外,还提供了交换元素位置、打印数组信息等辅助功能。

def swap(self, index1, index2):
if index1 < 0 or index2 < 0 or index1 >= self._size or index2 >= self._size:
raise Exception("Index is illegal")
self._data[index1], self._data[index2] = self._data[index2], self._data[index1]
def remove_max_element(self):
max_index = self.get_max_index()
self.remove(max_index)
def get_max_index(self):
if self.is_empty():
raise Exception("Error, Array is Empty!")
max_index = 0
for i in range(1, self.get_size()):
if self._data[i] > self._data[max_index]:
max_index = i
return max_index
def remove_min_element(self):
min_index = self.get_min_index()
self.remove(min_index)
def get_min_index(self):
if self.is_empty():
raise Exception("Error, Array is Empty!")
min_index = 0
for i in range(1, self.get_size()):
if self._data[i] < self._data[min_index]:
min_index = i
return min_index
def print_array_info(self):
print(f"Current data: {self._data[:self._size]}")
print(f"Size: {self.get_size()}")
print(f"Capacity: {self.get_capacity()}")

测试示例

以下是一些具体的操作示例,供测试验证。

# 初始化并添加元素
array = Array()
array.addLast(1)
array.addLast(2)
array.addLast(3)
array.addLast(4)
array.addLast(5)
array.addFirst(6)
array.add(1, 100) # 在索引1的位置添加100
print(array.get(1)) # 输出结果应为100
# 获取数组首位和末位元素
print(array.getFirst()) # 输出应为6
print(array.getLast()) # 输出应为5
# 修改数组中的元素
array.set(1, 1000)
print(array[1]) # 输出应为1000
# 检查元素是否存在
print(array.contains(1000)) # 输出应为True
# 查找元素位置
print(array.find(1000)) # 输出应为1
# 打印数组信息
print("Array contents: ", end=' ')
array.print_array_info()

总结

通过以上说明,可以清楚地掌握Python实现数组的基本实现方法和常用操作。以上实现涵盖了数组类的主要功能,通过合理设计使得数组能够高效地管理和操作数据集合。

上一篇:python的`__getitem__`方法
下一篇:vue前端传参和DRF后端接受参数

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月26日 22时21分00秒