Add 04-matrix-sort/row_col_sort_class.py
This commit is contained in:
		
							
								
								
									
										80
									
								
								04-matrix-sort/row_col_sort_class.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								04-matrix-sort/row_col_sort_class.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| class Matrix: | ||||
| 	def __init__(self, **kwargs): | ||||
| 		if kwargs.get('file'): | ||||
| 			self.matrix = self.__from_file(kwargs['file']) | ||||
| 		elif kwargs.get('text'): | ||||
| 			self.matrix = self.__parse(kwargs['text']) | ||||
| 		elif kwargs.get('matrix'): | ||||
| 			self.matrix = kwargs['matrix'] | ||||
|  | ||||
| 	def __from_file(self, file): | ||||
| 		with open(file, 'r') as file: | ||||
|  | ||||
| 			return self.parse(file.read()) | ||||
|  | ||||
| 	def __parse(self, matrix): | ||||
| 		out = [] | ||||
| 		for row in matrix.split('\n'): | ||||
| 			out.append([int(col) for col in row.split()]) | ||||
|  | ||||
| 		return out | ||||
|  | ||||
| 	@property | ||||
| 	def sum(self): | ||||
| 		row_sum  = [] | ||||
| 		col_sum = [0 for col in range(len(self.matrix)+1)] | ||||
|  | ||||
| 		for row in self.matrix: | ||||
| 			row_sum.append(sum(row)) | ||||
| 			for idx, col in enumerate(row): | ||||
| 				col_sum[idx] += col | ||||
|  | ||||
| 		return row_sum, col_sum | ||||
|  | ||||
| 	@property | ||||
| 	def sort_row(self): | ||||
| 		row_sum, col_sum = self.sum | ||||
| 		out = [] | ||||
| 		for index, row in sorted( [i for i in enumerate(row_sum)], key=lambda x:x[1]): | ||||
| 			out.append(self.matrix[index]) | ||||
|  | ||||
| 		return Matrix(matrix=out); | ||||
|  | ||||
| 	@property | ||||
| 	def sort_col(self): | ||||
| 		row_sum, col_sum = self.sum | ||||
| 		out = [] | ||||
| 		places = sorted( [i for i in enumerate(col_sum)], key=lambda x:x[1]) | ||||
|  | ||||
| 		for index, row in enumerate(self.matrix): | ||||
| 			out.append([row[i[0]] for i in places]) | ||||
|  | ||||
| 		return Matrix(matrix=out) | ||||
|  | ||||
| 	def __get_element_width(self): | ||||
| 		max = 0 | ||||
| 		for row in self.matrix: | ||||
| 			for element in row: | ||||
| 				if max < len(str(element)): | ||||
| 					max = len(str(element)) | ||||
|  | ||||
| 		return max | ||||
|  | ||||
| 	def __str__(self, width=None): | ||||
| 		width = self.__get_element_width() | ||||
| 		out = '' | ||||
|  | ||||
| 		for row in self.matrix: | ||||
| 			out +=' | '.join(['{:{}d}'.format(el, width) for el in row]) | ||||
| 			out += '\n' | ||||
|  | ||||
| 		return out | ||||
|  | ||||
| m1 ='''10 5 4 20 | ||||
| 9 33 27 16 | ||||
| 11 6 55 3''' | ||||
|  | ||||
| m1 = Matrix(text=m1) | ||||
| # print(m1.sum) | ||||
| print(m1.sort_row) | ||||
| print(m1.sort_col) | ||||
		Reference in New Issue
	
	Block a user