I gave an attempt at reinventing the wheel and recreate list methods using my own Array Class to broaden my understanding about lists. I would like advice regarding efficiency, and in implementing negative indexes, since my code only works for positive ones.
class Array: def __init__(self, List=[]): self.array = List def display(self): print(self.array) def len(self): array = self.array count = 0 for _ in array: count += 1 return count def append(self, value): array = self.array length = self.len() results = [None] * (length+1) for i in range(length): results[i] = array[i] results[length] = value self.array = results def search(self, value): array = self.array pos = -1 for index in range(self.len()): if array[index] == value: pos = index return pos def insert(self, index, value): array = self.array length = self.len() results = [None] * (length+1) if index > length: raise IndexError elif index == length: self.append(value) results = self.array else: for i in range(length): if i == index: for j in range(index + 1, length + 1): results[j] = array[j-1] results[index] = value break else: results[i] = array[i] self.array = results def delete(self, value): array = self.array length = self.len() results = [None] * (length-1) pos = self.search(value) if pos == -1: raise "Index Error: Element Not Found" else: for i in range(length): if i != pos: results[i] = array[i] else: for j in range(pos+1, length): results[j-1] = array[j] break self.array = results def pop(self): array = self.array length = self.len() results = [None] * (length-1) if length == 0: raise IndexError value = array[-1] for i in range(length-1): results[i] = array[i] self.array = results return value