List Array - Py
List Array - Py
-------------------------------------------------------
[program description]
-------------------------------------------------------
Author: Malaz Ismail
ID: 190894950
Email: isma4950@mylaurier.ca
__updated__ = "2020-02-27"
-------------------------------------------------------
"""
from copy import deepcopy
class List:
def __init__(self):
"""
-------------------------------------------------------
Initializes an empty list.
Use: target = List()
-------------------------------------------------------
Returns:
a new List object (List)
-------------------------------------------------------
"""
self._values = []
value = deepcopy(self._values[i])
return value
def __len__(self):
"""
-------------------------------------------------------
Returns the number of values in the list.
Use: n = len(source)
-------------------------------------------------------
Returns:
the number of values in the list.
-------------------------------------------------------
"""
return len(self._values)
self._values[i] = deepcopy(value)
return
if key in self._values:
isin = True
i = self._linear_search(key)
return isin
return validindex
temp = self._values[i]
self._values[i] = self._values[j]
self._values[j] = temp
return
return
def apply(self, func):
"""
-------------------------------------------------------
Applies an external function to every value in list.
Use: source.apply(func)
-------------------------------------------------------
Parameters:
func - a function that takes a single value as a parameter
and returns a value (function)
Returns:
None
-------------------------------------------------------
"""
for i in range (len(self._values)):
self._values[i] = func(self._values[i])
return
def clean(self):
"""
---------------------------------------------------------
The list contains one and only one of each value formerly present
in the list. The first occurrence of each value is preserved.
Use: source.clean()
-------------------------------------------------------
Returns:
None
-------------------------------------------------------
"""
i = 0
while i < len(self._values):
index = i+1
while index < len(self._values):
if self._values[index] == self._values[i]:
self._values = self._values[0:index] + self._values[index+1::]
else:
index += 1
i += 1
return
elif len(source1._values) == 0:
self._values += [source2._values[0]]
if len(source2._values) == 1:
source2._values = []
else:
source2._values = source2._values[1:len(source2._values)]
elif switch:
self._values += [source1._values[0]]
source1._values = source1._values[1:len(source1._values)]
else:
self._values += [source2._values[0]]
source2._values = source2._values[1:len(source2._values)]
return
def copy(self):
"""
-------------------------------------------------------
Duplicates the current list to a new list in the same order.
Use: target = source.copy()
-------------------------------------------------------
Returns:
target - a copy of self (List)
-------------------------------------------------------
"""
target = List()
target._values = self._values
return target
for i in self._values:
if key == i:
count+=1
return count
return index1
return
def is_empty(self):
"""
-------------------------------------------------------
Determines if the list is empty.
Use: b = source.is_empty()
-------------------------------------------------------
Returns:
True if the list is empty, False otherwise.
-------------------------------------------------------
"""
is_empty = False
if len(self._values) == 0:
is_empty = True
return is_empty
return identical
def max(self):
"""
-------------------------------------------------------
Finds the maximum value in list.
Use: value = source.max()
-------------------------------------------------------
Returns:
value - a copy of the maximum value in the list (?)
-------------------------------------------------------
"""
assert (len(self._values) > 0), 'Cannot find maximum of an empty list'
maxi = deepcopy(self._values[0])
for i in self._values:
if i > maxi:
maxi = i
return maxi
return
def min(self):
"""
-------------------------------------------------------
Finds the minimum value in list.
Use: value = source.min()
-------------------------------------------------------
Returns:
value - a copy of the minimum value in the list (?)
-------------------------------------------------------
"""
assert (len(self._values) > 0), 'Cannot find minimum of an empty list'
mini = deepcopy(self._values[0])
for i in self._values:
if i < mini:
mini = i
return mini
def peek(self):
"""
-------------------------------------------------------
Returns a copy of the first value in list.
Use: value = source.peek()
-------------------------------------------------------
Returns:
value - a copy of the first value in the list (?)
-------------------------------------------------------
"""
assert (len(self._values) > 0), 'Cannot peek at an empty list'
value = deepcopy(self._values[0])
return value
if len(args) == 1:
# pop the element at position i
i = args[0]
value = self._values.pop(i)
else:
# pop the last element
value = self._values.pop()
return value
return
def remove_front(self):
"""
-------------------------------------------------------
Removes the first node in the list.
Use: value = source.remove_front()
-------------------------------------------------------
Returns:
value - the first value in the list (?)
-------------------------------------------------------
"""
assert (len(self._values) > 0), 'Cannot remove from an empty list'
value = deepcopy(self._values[0])
self._values = self._values[1:len(self._values)]
return value
return
def reverse(self):
"""
-------------------------------------------------------
The contents of list are reversed in order with respect
to their order before the operation was called.
Use: source.reverse()
-------------------------------------------------------
Returns:
None
-------------------------------------------------------
"""
self._values = self._values[::-1]
return
def split(self):
"""
-------------------------------------------------------
Splits list into two parts. target1 contains the first half,
target2 the second half. Current list becomes empty.
Use: target1, target2 = source.split()
-------------------------------------------------------
Returns:
target1 - a new List with >= 50% of the original List (List)
target2 - a new List with <= 50% of the original List (List)
-------------------------------------------------------
"""
target1 = List()
target2 = List()
if len(self._values) % 2 == 0:
mid = len(self._values)//2
else:
mid = len(self._values)//2 + 1
target1._values = self._values[0:mid]
target2._values = self._values[mid:len(self._values)]
self._values = []
def split_alt(self):
"""
-------------------------------------------------------
Splits the source list into separate target lists with values
alternating into the targets. At finish source list is empty.
Order of source values is preserved.
Use: target1, target2 = source.split()
-------------------------------------------------------
Returns:
target1 - contains alternating values from source (List)
target2 - contains other alternating values from source (List)
-------------------------------------------------------
"""
target1 = List()
target2 = List()
left = True
while len(self._values) != 0:
if left:
target1._values += [self._values[0]]
self._values = self._values[1:len(self._values)]
else:
target2._values += [self._values[0]]
self._values = self._values[1:len(self._values)]
while len(self._values) != 0:
if func(self._values[0]):
target1._values += [self._values[0]]
else:
target2._values += [self._values[0]]
if len(self._values) == 1:
self._values = []
else:
self._values = self._values[1:len(self._values)]
while len(self._values) != 0:
if self._values[0] < key:
target1._values += [self._values[0]]
else:
target2._values += [self._values[0]]
if len(self._values) == 1:
self._values = []
else:
self._values = self._values[1:len(self._values)]
for i in source2._values:
if i not in self._values:
self._values += [i]
return
def __iter__(self):
"""
USE FOR TESTING ONLY
-------------------------------------------------------
Generates a Python iterator. Iterates through the list
from front to rear.
Use: for v in source:
-------------------------------------------------------
Returns:
value - the next value in the list (?)
-------------------------------------------------------
"""
for value in self._values:
yield value