From a756fd779bd0d8b8f3afcbc2ef4e6f841a7f529e Mon Sep 17 00:00:00 2001 From: dashavpav Date: Mon, 23 Mar 2020 10:46:01 +0300 Subject: [PATCH 1/3] First try --- homework1/ArrayList.py | 129 +++++++++++++++++++++++++++++++++ homework1/test.py | 161 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 homework1/ArrayList.py create mode 100644 homework1/test.py diff --git a/homework1/ArrayList.py b/homework1/ArrayList.py new file mode 100644 index 0000000..cb757e7 --- /dev/null +++ b/homework1/ArrayList.py @@ -0,0 +1,129 @@ +from array import * + +class ArrayList(): + def __init__(self, *args): + if args.__len__() == 0: + self._RList = array('i',) + else: + if type(args[0]) == int: + self._RList = array('i', args) + elif type(args[0]) == float: + self._RList = array('f', args) + elif type(args[0]) == str: + self._RList = array('u',) + for item in args: + self._RList += array('u', item) + + def __getitem__(self, index): + return self._RList[index] + + def __contains__(self, item): + if item in self._RList: + return True + else: + return False + + def __iter__(self): + return iter(self._RList) + + def __len__(self): + count = 0 + for el in self._RList: + count += 1 + return count + + def __reversed__(self): + self.reverse() + return self._RList + + def count(self, elem): + amount = 0 + for el in self._RList: + if(el == elem): + amount += 1 + return amount + + def index(self, elem): + for i, el in enumerate(self._RList): + if(el == elem): + pos = i + return pos + + # Добавляем все элементы второго списка к элементам первого + def extend(self, elem): + if type(elem) == ArrayList: + self._RList += elem._RList + else: + buf = ArrayList(elem) + self._RList += buf._RList + + # Добавление нового элемента в конец [] + def append(self, elem): + if type(elem) == int or type(elem) == float or type(elem) == str: + buf = ArrayList(elem) + self._RList += buf._RList + # Удаление по значению + def remove (self, elem): + buf = self._RList + self._RList = array(self._RList.typecode, ) + for el in buf: + if el != elem: + self.extend(el) + + def reverse(self):# Переворачивает + buf = self._RList + self._RList = array(self._RList.typecode,) + size_of_buf = buf.__len__() + for i, x in enumerate(buf): + self.extend(buf[size_of_buf-i-1]) + + # Удаление по индексу + def pop(self, index): + buf = self._RList + self._RList = array(self._RList.typecode, ) + for i, el in enumerate(buf): + if i != index: + self.extend(el) + + def insert(self, index, elem):# вставляет новые/ый элемент/ты на указанное место + buf_l = ArrayList() + buf_r = ArrayList() + if type(elem) is not list: + if type(elem) == float: + buf_l._RList = array('f',) + buf_r._RList = array('f',) + elif type(elem) == str: + buf_l._RList = array('u', ) + buf_r._RList = array('u', ) + else: + if type(elem[0]) == float: + buf_l._RList = array('f', ) + buf_r._RList = array('f', ) + elif type(elem[0]) == str: + buf_l._RList = array('u', ) + buf_r._RList = array('u', ) + for i, el in enumerate(self._RList): + if i < index: + buf_l.extend(el) + elif i > index: + buf_r.extend(el) + self._RList = array(self._RList.typecode,) + if index != 0: + self.extend(buf_l) + g = type(elem) + if type(elem) == list or type(elem) == str or type(elem) == tuple: + for el in elem: + self.extend(el) + else: + self.extend(el) + self.extend(buf_r) + else: + if type(elem) == list or type(elem) == str or type(elem) == tuple: + for el in elem: + self.extend(el) + else: + self.extend(el) + self.extend(buf_r) + + def print(self): + print(self._RList) diff --git a/homework1/test.py b/homework1/test.py new file mode 100644 index 0000000..0f2e5df --- /dev/null +++ b/homework1/test.py @@ -0,0 +1,161 @@ +from ArrayList import ArrayList + +print("ArrayList('abc', 'df')") +test = ArrayList('abc', 'df') +test.print() +# __getitem check +print("GetItem - test[4]") +print(test[4]) +# __iter__ check +print("Iter - iter(test)") +print(iter(test)) +# Contains check +print("Contains - test.__contains__(4)") +b = test.__contains__(4) +print(b) +print("__len__ - len(test)") +# __len__ check +b = len(test) +print(b) +print("Count - test.count('d')") +# count +print(test.count('d')) +print("index - test.index('c')") +# index +print(test.index('c')) +print("reverse - test.reverse()") +# Reverse and reversed +test.reverse() +test.print() +print("reversed - reversed(test)") +reversed(test) +test.print() +print("extend - test.extend(test2)") +test2 = ArrayList("efj") +test.extend(test2) +test.print() +print("extend - test.extend('ff')") +test.extend('ff') +# remove +print("Remove - ") +test.remove('d') +# pop +print("pop - test.pop(2") +test.pop(2) +test.print() +# insert +print("Insert - test.insert(0, ['o', 'aaaa'])") +test.insert(0, ['o', 'aaaa']) +test.print() +print("Insert - test.insert(3, 'k')") +test.insert(3, 'k') +print("Append - test.append('daa')") +test.append('daa') +test.print() + +print("ArrayList(1,2,3)") +test = ArrayList(1, 2, 2, 3) +test.print() +# __getitem check +print("GetItem - test[2]") +print(test[2]) +# __iter__ check +print("Iter - iter(test)") +print(iter(test)) +# Contains check +print("Contains - test.__contains__(2)") +b = test.__contains__(2) +print(b) +print("__len__ - len(test)") +# __len__ check +b = len(test) +print(b) +print("Count - test.count(2)") +# count +print(test.count(2)) +print("index - test.index(3)") +# index +print(test.index(3)) +print("reverse - test.reverse()") +# Reverse and reversed +test.reverse() +test.print() +print("reversed - reversed(test)") +reversed(test) +test.print() +print("extend - test.extend(test2)") +test2 = ArrayList(4,5,6) +test.extend(test2) +test.print() +print("extend - test.extend(7)") +test.extend(7) +# remove +print("Remove - test.remove(3)") +test.remove(3) +# pop +print("pop - test.pop(2") +test.pop(2) +test.print() +# insert +print("Insert - test.insert(0, [1, 2, 3])") +test.insert(0, [1, 2, 3]) +test.print() +print("Insert - test.insert(3, 10)") +test.insert(3, 10) +print("Append - test.append(22)") +test.append(22) +test.print() + + +print("ArrayList(1.5, 2.4, 3.3)") +test = ArrayList(1.5, 2.4, 3.3) +test.print() +# __getitem check +print("GetItem - test[0]") +print(test[0]) +# __iter__ check +print("Iter - iter(test)") +print(iter(test)) +# Contains check +print("Contains - test.__contains__(0)") +b = test.__contains__(0) +print(b) +print("__len__ - len(test)") +# __len__ check +b = len(test) +print(b) +print("Count - test.count(3.3)") +# count +print(test.count(3.3)) +print("index - test.index(3.3)") +# index +print(test.index(3.3)) +print("reverse - test.reverse()") +# Reverse and reversed +test.reverse() +test.print() +print("reversed - reversed(test)") +reversed(test) +test.print() +print("extend - test.extend(test2)") +test2 = ArrayList(4.2,5.1,6.0) +test.extend(test2) +test.print() +print("extend - test.extend(7.9)") +test.extend(7.9) +# remove +print("Remove - test.remove(3.3)") +test.remove(3.3) +# pop +print("pop - test.pop(2") +test.pop(2) +test.print() +# insert +print("Insert - test.insert(1, [0.1, 0.2, 0.3])") +test.insert(1, [0.1, 0.2, 0.3]) +test.print() +print("Insert - test.insert(4, 10.10000)") +test.insert(4, 10.10000) +print("Append - test.append(22.22)") +test.append(22.22) +test.print() From 1a9db07653b53a2f38ce0e5c0193ce9b19a5ce79 Mon Sep 17 00:00:00 2001 From: dashavpav Date: Mon, 30 Mar 2020 22:05:09 +0300 Subject: [PATCH 2/3] With amendment --- homework1/ArrayList.py | 58 ++++++++++++++++++++++++++++++++---------- homework1/MyIter.py | 32 +++++++++++++++++++++++ homework1/test.py | 19 ++++++++++++++ 3 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 homework1/MyIter.py diff --git a/homework1/ArrayList.py b/homework1/ArrayList.py index cb757e7..180c7a4 100644 --- a/homework1/ArrayList.py +++ b/homework1/ArrayList.py @@ -1,4 +1,5 @@ from array import * +from MyIter import * class ArrayList(): def __init__(self, *args): @@ -15,7 +16,29 @@ def __init__(self, *args): self._RList += array('u', item) def __getitem__(self, index): - return self._RList[index] + if isinstance(index, slice): + if index.start != None: + start = index.start + if start < 0: + start += len(self) + else: + start = 0 + if index.stop != None: + stop = index.stop - 1 + if stop < 0: + stop += len(self) + else: + stop = len(self) - 1 + if index.step == None: + step = 1 + else: + if index.step < 0: + stop = index.stop + 1 + step = index.step + buf = array(self._RList.typecode,) + for el in range(start, stop, step): + buf += array(self._RList.typecode, [self._RList[el]]) + self._RList = buf def __contains__(self, item): if item in self._RList: @@ -24,7 +47,7 @@ def __contains__(self, item): return False def __iter__(self): - return iter(self._RList) + return MyIter(self._RList, -1) def __len__(self): count = 0 @@ -39,9 +62,12 @@ def __reversed__(self): def count(self, elem): amount = 0 for el in self._RList: - if(el == elem): + if (el == elem): amount += 1 return amount + # def change_type(self, type): + # if type == float: + # def index(self, elem): for i, el in enumerate(self._RList): @@ -59,7 +85,11 @@ def extend(self, elem): # Добавление нового элемента в конец [] def append(self, elem): - if type(elem) == int or type(elem) == float or type(elem) == str: + if self.__len__() == 0: + buf = ArrayList(elem) + self._RList = buf._RList + elif type(elem) == int or type(elem) == float or type(elem) == str: + buf = array(self._RList.typecode, ) buf = ArrayList(elem) self._RList += buf._RList # Удаление по значению @@ -70,12 +100,12 @@ def remove (self, elem): if el != elem: self.extend(el) - def reverse(self):# Переворачивает - buf = self._RList - self._RList = array(self._RList.typecode,) - size_of_buf = buf.__len__() - for i, x in enumerate(buf): - self.extend(buf[size_of_buf-i-1]) + def reverse(self): # Переворачивает + buf = array(self._RList.typecode,) + it = self.__iter__().last() + for i, x in enumerate(self): + buf += array(self._RList.typecode, [self._RList[it - i]]) + self._RList = buf # Удаление по индексу def pop(self, index): @@ -85,7 +115,9 @@ def pop(self, index): if i != index: self.extend(el) - def insert(self, index, elem):# вставляет новые/ый элемент/ты на указанное место + def insert(self, index, elem): # вставляет новые/ый элемент/ты на указанное место + if index < 0: # Учла, если индекс отрицательный. + index = self.__len__() + index buf_l = ArrayList() buf_r = ArrayList() if type(elem) is not list: @@ -115,14 +147,14 @@ def insert(self, index, elem):# вставляет новые/ый элемен for el in elem: self.extend(el) else: - self.extend(el) + self.extend(elem) self.extend(buf_r) else: if type(elem) == list or type(elem) == str or type(elem) == tuple: for el in elem: self.extend(el) else: - self.extend(el) + self.extend(elem) self.extend(buf_r) def print(self): diff --git a/homework1/MyIter.py b/homework1/MyIter.py new file mode 100644 index 0000000..b18e676 --- /dev/null +++ b/homework1/MyIter.py @@ -0,0 +1,32 @@ + +class MyIter(): + def __init__(self, collection, cursor): + if cursor < -1 and cursor < len(collection): + raise ValueError() + self._collection = collection + self._cursor = cursor + + def first(self): + self._cursor = -1 + + def last(self): + self._cursor = len(self._collection) - 1 + return self._cursor + + def __next__(self): + if self._cursor + 1 >= len(self._collection): + raise StopIteration() + self._cursor += 1 + return self._collection[self._cursor] + + def current(self): + return self._collection[self._cursor] + + def __iter__(self): + return self._cursor + + def prev(self): + if self._cursor + 1 >= len(self._collection) or self._cursor == 0: + raise StopIteration() + self._cursor -= 1 + return self._collection[self._cursor] diff --git a/homework1/test.py b/homework1/test.py index 0f2e5df..b776f3a 100644 --- a/homework1/test.py +++ b/homework1/test.py @@ -159,3 +159,22 @@ print("Append - test.append(22.22)") test.append(22.22) test.print() + +print("Исправление ошибок") +test = ArrayList(1,2,3,4,5,6) +test.print() +test.insert(-2, 35) +test.print() +test[1::1] +test.print() +test[1:5:2] +test.print() + +test = ArrayList('aa', 'bb', 'cc') +test.print() +test[1::1] +test.print() +test = ArrayList() +test.print() +test.append('gg') +test.print() \ No newline at end of file From 40764e60707f364277f2c9fad5a73af3f6c15ae9 Mon Sep 17 00:00:00 2001 From: dashavpav Date: Mon, 30 Mar 2020 22:57:22 +0300 Subject: [PATCH 3/3] Forgot usual getitem by index --- homework1/ArrayList.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homework1/ArrayList.py b/homework1/ArrayList.py index 180c7a4..4ef18af 100644 --- a/homework1/ArrayList.py +++ b/homework1/ArrayList.py @@ -39,6 +39,8 @@ def __getitem__(self, index): for el in range(start, stop, step): buf += array(self._RList.typecode, [self._RList[el]]) self._RList = buf + else: + return self._RList[index] def __contains__(self, item): if item in self._RList: