我有一个包含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数组的代码,使每行和每列中的每个元素在其自己的行和列中都是唯一的?
答案 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"
用你的数组(列表列表)调用该函数。可以更改返回值以满足您的需求。注意它停在发现的第一个骗局。如果你需要不同的代码,可以改变结构位。