我有一个总共有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数组中的循环部分:
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数组,以使每行和每列中的每个元素在其自己的行和列中都是唯一的?
发布于 2014-10-13 14:47:11
假设您有一个大小为N*N
的数组arr
,然后可以遍历它的长度,然后为每一行和每一列创建一个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
是为了能够检查列和行。简单地说,zip(*some_list)
会将some_list
的行转换为列,并将列转换为行。然后执行与上面完全相同的操作,检查每一行现在是否重复。当然,我们检查的“行”实际上是原始数组的列。
发布于 2014-10-13 14:53:06
稍后我将详细介绍,但这里有一些快速代码:
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"
使用您的数组(列表列表)调用函数。可以更改返回值以满足您的需要。请注意,它在找到的第一个副本处停止。如果你需要不同的代码,可以改变结构位。
https://stackoverflow.com/questions/26342672
复制相似问题