对于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/

10-11 04:31