Как разделить два двухмерных списка? - PullRequest
0 голосов
/ 15 января 2020

Я создал объектную матрицу, которая обрабатывает две матрицы: self.matrix_original, которая является матрицей, загруженной из файла, и self.new_matrix, которая сначала клонируется из исходной, а затем сделала некоторые операции над ней. Я также использую два метода: self.deleteRepetition() и delete10(). Первый - для удаления повторяющихся строк, второй - для удаления столбцов, созданных только с единицами и нулями.

    def deleteRepetition(self):
        matrix = self.matrix_original.copy()
        for i, row in enumerate(matrix):
            index = matrix.index(row)
            matrix[index+1:] = (value for value in matrix[index+1:] if value != row)
        self.new_matrix = matrix.copy()
        self.n_dim[0] = len(matrix)
        self.n_dim[1] = len(matrix[0])
    def delete10(self):
        matrix = self.new_matrix.copy()
        columns = list(range(len(matrix[0])))
        columns_to_delete = []
        for i, cell in enumerate(matrix[0]):
            suma = 0
            for x, row in enumerate(matrix):
                if row[i] == cell:
                    suma = suma + 1
            if suma == len(matrix):
                columns_to_delete.append(i)
        self.deletedColumns = columns_to_delete.copy()
        columns_to_delete.reverse()
        for i in columns_to_delete:
            columns.pop(columns.index(i))
            for x, row in enumerate(matrix):
                matrix[x].pop(i)
        self.n_dim[0] = len(matrix[0])
        self.n_dim[1] = len(matrix)
        self.new_matrix = matrix.copy()
        return columns

Первый метод удаляет повторение строк, а второй - для удаления столбцов, созданных только с единицами и нулями.

Так что после запуска программы перед вызовом любого из методов она выглядит нормально. У меня есть оригинальная и новая матрица, загруженная правильно:

matrixes before calling methods

Затем я звоню deleteRepetition():

matrixes after deleteRepetition method

Все выглядит хорошо. Исходная матрица такая же, как и раньше, а новая уменьшена. Поэтому я пытаюсь позвонить delete10(). Он выполняет работу по сокращению новой матрицы, но оригинальная искажается в процессе, подобном этому:

matrixes after both methods've been called

Может кто-нибудь определить, где ошибка? В delete10() я использую матрицу, которую я скопировал через <matrix>.copy(), так что она не должна так работать, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...