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