У меня есть прямоугольная матрица только с цифрами, я хочу рассчитать количество различных уникальных 2 × 2 квадратных матриц в ней.

Я сохранил все возможные матрицы 2x2 в новом списке. Теперь я хочу переместить все повторяющиеся матрицы из этого нового списка. Я не знаю, как это сделать. Если я использую функцию 'set ()', это выдает ошибку "unhashable type: 'list'".

def differentSquares(matrix):
    squares_list = []
    for i in range (len(matrix)-1):
        for j in range (len(matrix[i])-1):
            temp=[[matrix[i][j],matrix[i][j+1]],
                  [matrix[i+1][j],matrix[i+1][j+1]]]
            squares_list.append(temp)
    return len(squares_list)

Я знаю, что эту проблему можно решить с помощью другой логики, но я все еще хочу знать, как кто-то может удалить дублирующую матрицу из списка матриц.

Если я введу следующий вход

Matrix=[[1,2,1], 
        [2,2,2], 
        [2,2,2], 
        [1,2,3], 
        [2,2,1]]

Возвращаемое значение равно 8, поскольку я вернул длину списка, не удаляя дубликаты. Если я удалю дубликаты, ответ станет 6 (правильный ответ)

1
Shahmir Asif 18 Авг 2019 в 04:18

2 ответа

Лучший ответ

Как упомянул Алекс, вы можете хэшировать только объекты неизменяемого типа в наборе. list изменчив, тогда как tuple неизменен.

Для получения дополнительной информации - Hashable, неизменяемый

Кроме того, вы можете напрямую добавлять свои неизменяемые объекты в набор. Поскольку набор всегда будет содержать уникальные элементы, операция add не будет добавлять дубликаты.

def differentSquares(matrix):
    unique_squares = set() # Create a set for adding unique 2x2 matrices
    for i in range (len(matrix)-1):
        for j in range (len(matrix[i])-1):
            temp=((matrix[i][j],matrix[i][j+1]),
                (matrix[i+1][j],matrix[i+1][j+1]))
            unique_squares.add(temp) # Add the matrix. It will not add any duplicates
    return len(unique_squares) # Returns 6 for the given example
0
GaneshTata 18 Авг 2019 в 06:39

Списки изменчивы (могут быть изменены) и поэтому не могут быть хешированы. Вместо этого попробуйте использовать кортежи, которые являются неизменными и, следовательно, могут быть хешированы.

def differentSquares(matrix):
    squares_list = []
    for i in range(len(matrix) - 1):
        for j in range(len(matrix[i]) - 1):
            temp=((matrix[i][j],   matrix[i][j+1]),
                  (matrix[i+1][j], matrix[i+1][j+1]))
            squares_list.append(temp)
    return len(set(squares_list))
0
Alex 18 Авг 2019 в 05:10