犯错误,Python功能仍然有效。为什么?

时间:2012-04-13 16:55:08

标签: python list sudoku transpose

我使用Udacity一直在学习编程和Python大约一个月。对于其中一个问题,我们应该编写一个函数来检查传入的数独列表是否有效。

在下面的for循环中,我希望使用row同时使用原始列表和转置列表遍历colzip(),但错误地留在row中在or语句的后半部分。我跑了它,令我惊讶的是,它仍然继续回答正确的答案。

def check_sudoku(array):  
    is_sudoku = True
    reference = range(1, len(array) + 1)
    transposed = zip(array)

    for row, col in zip(array, transposed):
        if sorted(row) != reference or sorted(row) != reference:
            is_sudoku = False
            break
    return is_sudoku

我的猜测是因为我默认定义了is_sudoku = True,并且我将rows与引用列表进行比较,因此即使我的转置不起作用,它也会捕获无效值。当我用row取代第二个col时,它就破了。

我的问题是,我猜对了吗?如果没有,为什么这段代码有效,怎么能更好地写这个?

谢谢! (如果你想查看我传入的列表 - http://codepad.org/IXDlZuUu

,也会粘贴在键盘上

1 个答案:

答案 0 :(得分:0)

如果正确的值为False,那么您的函数可以正常工作,因为在某些时候sorted(row) != reference。至于重写它,我认为这样的事情会更清楚:

def check_sudoku(array):  
    reference = range(1, len(array) + 1)
    transposed = zip(array)
    for row, col in zip(array, transposed):
        if sorted(row) != reference or sorted(row) != reference:
            return False
    return True

此外,我很难理解为什么你会transposed = zip(array)然后zip(array, transposed)。据我所知,只需要一个像[1, 2, 3]这样的列表并将其转换为[(1, (1,)), (2, (2,)), (3, (3,))]

如果您希望遍历行和列,这里有一种方法可行。

>>> rows = incorrect
>>> cols = [[row[i] for i in range(len(rows[0]))] for row in rows]
>>> cols = [[row[i] for row in rows] for i in range(len(row))]
>>> cols
[[4, 6, 3, 9, 7, 8, 1, 5, 2], [1, 5, 9, 6, 3, 2, 4, 8, 7], [2, 8, 7, 4, 5, 1, 9, 3, 6], [3, 9, 5, 2, 1, 7, 6, 4, 8], [6, 4, 2, 3, 8, 9, 5, 7, 1], [7, 1, 8, 5, 4, 6, 3, 2, 9], [8, 3,
 1, 7, 6, 4, 2, 9, 5], [5, 2, 6, 8, 9, 3, 7, 1, 4], [1, 7, 4, 1, 2, 5, 8, 6, 3]]
>>> rows
[[4, 1, 2, 3, 6, 7, 8, 5, 1], [6, 5, 8, 9, 4, 1, 3, 2, 7], [3, 9, 7, 5, 2, 8, 1, 6, 4], [9, 6, 4, 2, 3, 5, 7, 8, 1], [7, 3, 5, 1, 8, 4, 6, 9, 2], [8, 2, 1, 7, 9, 6, 4, 3, 5], [1, 4,
 9, 6, 5, 3, 2, 7, 8], [5, 8, 3, 4, 7, 2, 9, 1, 6], [2, 7, 6, 8, 1, 9, 5, 4, 3]]