-
Notifications
You must be signed in to change notification settings - Fork 0
/
Row_Col.py
140 lines (103 loc) · 4.47 KB
/
Row_Col.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
class Array:
def __init__(self, row):
if type(row) not in (list, tuple, Row, Column):
raise AssertionError(f'{row} is not an instance of a sequancial ordered numbers. \n')
if False in [type(e) in (int, float) for e in row]:
raise AssertionError(f'{row} contains a non numerical value. \n')
self.row = [int(entry) if float(entry) == int(entry) else round(float(entry), 4) for entry in row]
def _check_operational(self, val):
return True if type(val) in (Row, Column, list, tuple) else False
def _raise_length(self, val):
if len(self) != len(val):
raise AssertionError(f'The length of {val} is inconsistent. \n')
def _raise_index(self, val):
if type(val) != int:
raise TypeError(f"Row indices must be integers, not str")
def __str__(self):
return self.row.__str__()
def __repr__(self):
return f"{type(self).__name__}({self.row})"
def __pos__(self):
return eval(repr(self))
def __neg__(self):
return eval(f'{type(self).__name__}(' + str([-entry for entry in self.row]) + ')')
def __add__(self, val):
if type(val) in [int, float]:
return eval(f'{type(self).__name__}(' + str([entry + val for entry in self.row]) + ')')
elif self._check_operational(val):
self._raise_length(val)
return eval(f'{type(self).__name__}(' + str([e1 + e2 for e1, e2 in zip(self, val)]) + ')')
def __radd__(self, l_val):
return self + l_val
def __sub__(self, val):
return self + -val
def __rsub__(self, l_val):
return -self + l_val
def __mul__(self, val):
if type(val) in (int, float):
return eval(f'{type(self).__name__}(' + str([val * entry for entry in self.row]) + ')')
elif self._check_operational(val):
self._raise_length(val)
return eval(f'{type(self).__name__}(' + str([e1 * e2 for e1, e2 in zip(self, val)]) + ')')
def __rmul__(self, l_val):
return self * l_val
def __truediv__(self, val):
if type(val) in (int, float):
return eval(f'{type(self).__name__}(' + str([entry / val for entry in self.row]) + ')')
elif self._check_operational(val):
self._raise_length(val)
return eval(f'{type(self).__name__}(' + str([e1 / e2 for e1, e2 in zip(self, val)]) + ')')
def __rtruediv__(self, l_val):
if type(val) in (int, float):
return eval(f'{type(self).__name__}(' + str([l_val / entry for entry in self.row]) + ')')
elif self._check_operational(l_val):
self._raise_length(val)
return eval(f'{type(self).__name__}(' + str([e2 / e1 for e1, e2 in zip(self, val)]) + ')')
def __iter__(self):
return iter(self.row)
def __getitem__(self, entry_num):
self._raise_index(entry_num)
return (self.row[entry_num])
def __delitem__(self, entry_num):
self.row[entry_num] = 0
def __len__(self):
return len(self.row)
def __setitem__(self, entry, val):
self.row[entry] = val
def __eq__(self, right):
if type(right) in (Row, Column, Array, list, tuple, set):
return False if len(self) != len(right) else not(0 in ([1 if i == j else 0 for i, j in zip(self, right) ]))
def get_unit(self, entry_num):
val = self[entry_num]
return self / val
def add_entry(self, *entries):
for e in entries:
if type(e) not in (int, float):
raise AssertionError(f'{e} is not an instance of a numerical value. ')
self.row.append(e)
def del_entry(self, entry_num):
del self.row[entry_num - 1]
def get_pivot_indx(self):
counter = 0
for val in self:
if val == 0:
counter += 1
else:
break
return counter if counter <= len(self)-1 else None
def isZero(self):
return (sum([e for e in self.row]) == 0)
class Row(Array):
def __str__(self):
return '| ' + ' '.join([str(entry) for entry in self.row]) + ' |'
def get_row(self):
return self.row
class Column(Array):
def __str__(self):
maxi = max([len(str(e)) for e in self.row])
return '\n'.join(['|' + eval("'{" + f":^{maxi+2}" + "}'.format( str(e))") + '|' for e in self.row])
def get_column(self):
return self.row
if __name__ == '__main__':
a = Array([0, 0, 0, 0])
print(a.get_pivot_indx())