如何确保使用2D数组创建的3x3表中的每个值在其自己的行和列中都是唯一的?

时间:2014-10-13 14:42:15

标签: python arrays multidimensional-array

我有一个包含9个元素的2D数组,产生一个3x3表,如下所示:

Z|A|Q
Z|Q|Z
Q|Z|A

上表显示了无效的2D数组,因为第一列中有2个“Z”字符

Z|A|Q
A|Q|Z
Q|Z|A

上面显示了一个有效的2D数组,每个值在各自的行和列中都是不同的:

我被困在整个2D阵列的循环部分:

for i, row in enumerate(BOARD):
    for j, column in enumerate(row):
        userInput = raw_input ("Please enter character number "+str(zeroCount)+" out of 9 into the Sudoku board(the character will fill the board up row by row):")
        BOARD[i][j] = userInput
        zeroCount = zeroCount +1

如何创建检查2D数组的代码,使每行和每列中的每个元素在其自己的行和列中都是唯一的?

2 个答案:

答案 0 :(得分:0)

假设您有一个大小为arr的数组N*N,那么您可以迭代它的长度,然后为每个行和列创建一个set。如果集合的长度小于N的长度,那么必须有重复的because sets cannot contain duplicate elements

arr = [['Z', 'A', 'Q'], ['A', 'Q', 'Z'], ['Q', 'Z', 'A']]

# "Invert" the array so the columns are rows and vice versa.
zipped = list(zip(*arr))

N = len(arr)
# Iterate over the indices (0, 1, 2 in this case) of the array.
for i in range(N):
    # Test whether there are any duplicates by comparing the lengths of a set and N
    if len(set(arr[i])) < N:
        print('Non-unique!')
        break
    # Do the same again but now for the zipped array, in effect the "columns"
    if len(set(zipped[i])) < N:
        print('Non-unique!')
        break

上面的代码将迭代range(N),这意味着它将有效地遍历每行和每列的索引(0,1,2)。

对于每个索引,代码将查看该行并从中创建一个集合。集合是无序集合,不能包含重复项,这意味着如果您set(['A', 'A', 'B']} {'A', 'B'},则会有zip(*some_list)。然后,您可以使用此事实来检查重复项,就好像集合的长度小于创建它的长度一样,列表必须具有重复项。

使用zip是为了能够检查列和行。简单来说,some_list会将{{1}}的行转换为列,将列转换为行。然后,您完成与上面完全相同的操作,检查每一行是否现在是重复的。当然,我们检查的“行”实际上是原始数组的列。

答案 1 :(得分:0)

稍后会充实,但这里有一些快速代码:

def check_dup_rows_coils(a):
    for row in a:
        if len(set(row)) != len(row):
            return "Dupe in row" + str(row)
    for col in zip(*a):  # iterate over transposed matrix i.e. columns
        if len(set(col)) != len(col):
            return "Dupe in col" + str(col)
    return "no dupes"

用你的数组(列表列表)调用该函数。可以更改返回值以满足您的需求。注意它停在发现的第一个骗局。如果你需要不同的代码,可以改变结构位。