从矩阵列表中删除重复的矩阵

时间:2019-08-18 01:18:27

标签: python python-3.x matrix duplicates

我只有一个只有数字的矩形矩阵,我想计算其中不同的唯一2×2正方形矩阵的数量。

我将所有可能的2x2矩阵存储在新列表中。现在,我想从此新列表中移出所有重复的矩阵。我不知道该怎么做。如果我使用'set()'函数,则会显示错误“无法散列的类型:'列表'”。

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 个答案:

答案 0 :(得分:0)

列表是可变的(可以更改),因此不能进行哈希处理。相反,请尝试使用不可变的元组,因此可以对其进行哈希处理。

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))

答案 1 :(得分:0)

如Alex所述,您只能对集合中的不可变类型对象进行哈希处理。 list是可变的,而tuple是不可变的。

有关更多信息-Hashable, immutable

此外,您可以将不可变对象直接添加到集合中。由于集合将始终包含唯一元素,因此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