Python实现自建数组

Task 1 ---- 数组


题目:

  • 实现一个支持动态扩容的数组
  • 实现一个大小固定的有序数组,支持动态增删改操作
  • 实现两个有序数组合并为一个有序数组

说明:
  • 由于工作时间原因,此次的比较粗糙,部分地方偷懒了
  • 此处使用了python自带的list,按道理说应该去查看python源码,来构造
  • 个人觉得最理想的应该是了解计算机底层原理,自己开辟内存实现,但是由于难度较大,需要底层原理,此处暂时搁置,待以后会继续完善
  • 这里我将三个题目写在一个文件,其中参数说明:
    def __init__(self, *args, size=None, fixed_size=False):
        """
        
        :param args: 可以直接初始生成数组,例如  list_exmple = OwnArray(1, 2, 3, 4)
        :param size: 指定数组长度
        :param fixed_size: 指定数组是否长度固定
        """

    def append(self, value, sorted=False):
        """
        
        :param value: append 的参数, 支持list
        :param sorted: 是否排序,需要完善
        :return: 
        """

源码

# coding=utf-8


class OwnArray:

    def __init__(self, *args, size=None, fixed_size=False):
        if not isinstance(fixed_size, bool) and fixed_size:
            raise TypeError("Fixed size must be bool")

        self._fixed = fixed_size

        if args:
            self._data = [i for i in args]
            if self._fixed:
                if not size:
                    raise IOError("While array length is fixed, size not be none")
                else:
                    if not isinstance(size, int):
                        raise TypeError("List length must be integer")
                    self._size = size
                    self.is_empty = False
                    none_data = [None] * (self._size - len(self._data))
                    self._data += none_data
        else:

            if size:
                if not isinstance(size, int):
                    raise TypeError("List length must be integer")
                self._size = size
                self.is_empty = False
                self._data = [None] * self._size
            else:
                self._size = 0
                self.is_empty = True
                self._data = []

    def __str__(self):
        str_res = """
        Array: {array}
            empty: {empty}
            length: {length}
        """.format(array=self._data, empty=self.is_empty, length=self._size)
        return str_res

    def insert(self, index, value):
        """
        if the array is empty, the data will be still insert, and index is 0
        :param index: insert index, must be integer
        :param value: insert data
        :return:
        """
        if not isinstance(index, int):
            raise TypeError("Index must be integer")
        if self.is_empty:
            if self._fixed:
                self._data = [None] + self._data[1:]
            else:
                self._data = [value]
                self.is_empty = False
                self._size += 1
        else:
            if not self._size > index:
                raise IndexError("Index be not more than array length")
            else:
                if self._fixed:
                    self._data = self._data[:index] + [value] + self._data[index: -1]
                else:
                    self._data = self._data[:index] + [value] + self._data[index:]
                    self._size += 1

    def append(self, value, sorted=False):
        """

        :param value:
        :return:
        """
        if self._fixed:
            raise IOError("The array length is fixed, you need to use insert")
        else:
            if isinstance(value, list):
                if not sorted:
                    self._data += value
                else:
                    # 有序数组合并,这里还需不断完善,此处由于时间有限,需要上班,就偷懒使用了sort()
                    self._data += value
                    self._data.sort()
                self._size += len(value)
                self.is_empty = False
            else:
                if self.is_empty:
                    self._data = [value]
                    self.is_empty = False
                    self._size += 1
                else:
                    self._data += [value]
                    self._size += 1

    def delete(self, index):
        """

        :param index:
        :return:
        """
        if not isinstance(index, int):
            raise TypeError("Index must be integer")
        if self.is_empty:
            raise IOError("The array is empty")
        else:
            if self._size < index - 1:
                raise IndexError("Index be not more than array length")
            else:
                self._data = self._data[:index] + self._data[index + 1:]
                if self._fixed:
                    self._data += [None]
                else:
                    self._size -= 1

    def pop(self, index=None):
        """

        :param index:
        :return:
        """
        if index:
            if not isinstance(index, int):
                raise TypeError("Index must be integer")
            if self.is_empty:
                raise IOError("The array is empty")
            else:
                if not self._size > index:
                    raise IndexError("Index be not more than array length")
                else:
                    self._data = self._data[:index] + self._data[index + 1:]
                    if self._fixed:
                        self._data += [None]
                    else:
                        self._size -= 1
        else:
            if self.is_empty:
                raise IOError("The array is empty")
            else:
                if self._size == 1:
                    if self._fixed:
                        self._data = [None]
                    else:
                        self._data = []
                        self._size = 0
                        self.is_empty = True
                else:
                    self._data = self._data[1:]
                    if self._fixed:
                        self._data += [None]
                    else:
                        self._size -= 1

    def update(self, index, value):
        """

        :param index:
        :param value:
        :return:
        """
        if not isinstance(index, int):
            raise TypeError("Index must be integer")
        if self.is_empty:
            raise IOError("The array is empty")
        else:
            if not self._size > index:
                raise IndexError("Index be not more than array length")
            else:
                self._data = self._data[:index] + [value] + self._data[index + 1:]

if __name__ == '__main__':
    # array = OwnArray(1, 2, 3)
    # print(array)
    # array.insert(2, 5)
    # print(array)
    # array.append(4)
    # print(array)
    # array.delete(2)
    # print(array)
    # array.pop(1)
    # print(array)
    # array.update(2, 9)
    # print(array)
    array = OwnArray(1, 2, 3, size=5, fixed_size=True)
    print(array)
    array.insert(2, 5)
    print(array)
    try:
        array.append(4)
        print(array)
    except Exception as e:
        print('append:', e)
    array.delete(2)
    print(array)
    array.pop(1)
    print(array)
    array.update(2, 9)
    print(array)

你可能感兴趣的:(学习,DataWhale,学习)