对于for循环和if语句,我的解决方法可能有些紧张。因此,我有下面提供的这些数据。数据solutions
是具有1或0的列表的列表。 solutions
中只有一个6x6列表是正确的解决方案。我实际上是手动解决的,发现它是solutions
(python索引solutions[4]
)中的第五个列表。但是我无法保证我知道这一点!在对solutions
列表进行转置后,转置列表中的每个元素应假定为1,以反映x
数据中的相应数字,如下所示。同样,在每组1(个)之间必须有一个0。例如,x[2] = [2, 1, 1]
。这意味着在np.transpose(solutions[p])[2]
中,列表必须为[1,1,0,1,0,1]
。
因此,下面的代码是尝试编写一些东西的尝试,该检查根据solutions
检查每个x
中每行的正确间距和顺序。
final_solutions = []
for p in range(0,len(solutions)):
sol_trans = np.transpose(solutions[p])
for q in range(0,len(x)):
count = 0
for r in range(0,len(sol_trans[q])):
if sol_trans[q][r] == 0:
isok = True
if sol_trans[q][r] == 1:
if sol_trans[q][r+x[q][count]] != 1:
r += x[q][count]-1
count += 1
isok = True
else:
isok = False
break
if isok == True:
final_solutions.append(solutions[p])
我将在下面为您提供一些示例数据。
x
Out: [[1], [4], [2, 1, 1], [1, 1, 1], [4], [1, 1]]
作为测试失败的一个示例,
solutions[0]
会失败,因为当应该有四个连续的1时,np.transpose(solutions[p])[1]
在1中有一个中断。这也将失败,因为np.transpose(solutions[p])[2]
在1的条目之间不留空格。有四个连续的1,当应该有两个时,y后面跟一个空格,一个1,然后再跟另一个1。这也会失败,因为np.transpose(solutions[p])[3]
需要三个单个的1隔开。但是,前两个没有隔开。solutions
Out:
[([0, 0, 0, 1, 0, 1],
[0, 1, 1, 1, 1, 0],
[0, 0, 1, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 1, 1, 0, 1, 1],
[1, 1, 0, 0, 0, 0]),
([0, 0, 0, 1, 0, 1],
[0, 1, 1, 1, 1, 0],
[0, 0, 1, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 1, 1],
[0, 1, 1, 0, 0, 0]),
([0, 0, 0, 1, 0, 1],
[0, 1, 1, 1, 1, 0],
[1, 0, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 1, 1, 0, 1, 1],
[0, 1, 1, 0, 0, 0]),
([0, 0, 1, 0, 0, 1],
[0, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 1, 0],
[0, 0, 1, 1, 1, 1],
[1, 1, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 0]),
([0, 0, 1, 0, 0, 1],
[0, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 1, 1],
[0, 0, 1, 1, 0, 0]),
([0, 0, 1, 0, 0, 1],
[1, 1, 1, 1, 0, 0],
[0, 1, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 1, 1, 0, 1, 1],
[0, 0, 0, 1, 1, 0]),
([0, 0, 1, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 0, 0, 1, 0, 1],
[0, 1, 1, 1, 1, 0],
[0, 1, 1, 0, 1, 1],
[1, 1, 0, 0, 0, 0]),
([0, 0, 1, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 0, 0, 1, 0, 1],
[0, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 1, 1],
[0, 1, 1, 0, 0, 0]),
([0, 0, 1, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 0, 1],
[0, 0, 1, 1, 1, 1],
[1, 1, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 0]),
有谁知道如何解决此损坏的代码?也许他们已经解决了类似的问题,或者知道了一种我看不到的直观方法来解决此问题。
感谢您到目前为止!这段代码是朋友给我的难题的最后一部分。
最佳答案
这是一个解决方案。我将粘贴的解决方案复制为列表文字,因此必须首先将我的解决方案转换为numpy矩阵。
for si, solution in enumerate(solutions):
solution = np.matrix(solution)
matched_solution = True
tran_solution = np.transpose(solution)
for i, row_x in enumerate(x):
row = tran_solution[i]
row_x_calc = []
cur = 0
for val in row.flat:
if val:
cur += 1
elif cur:
row_x_calc.append(cur)
cur = 0
else:
if cur:
row_x_calc.append(cur)
if row_x != row_x_calc:
matched_solution = False
break
if matched_solution:
print 'Found', si
print solution
break
关于python - Python:测试以检查列表中 bool 元素的正确顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34237276/