У меня есть прямоугольная матрица только с цифрами, я хочу рассчитать количество различных уникальных 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 (правильный ответ)
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
Списки изменчивы (могут быть изменены) и поэтому не могут быть хешированы. Вместо этого попробуйте использовать кортежи, которые являются неизменными и, следовательно, могут быть хешированы.
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))
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.