为什么这个python-2.7测试用例返回True?

时间:2016-08-25 09:13:08

标签: python python-2.7 loops for-loop

def antisymmetric(A):
    #Write your code here
    for i in range(3):
        for j in range(3):
            if  A[i][j] == -A[j][i]:
                return True
            else:
                return False    


# Test Cases:

print antisymmetric([[0, 1, 2], 
                     [-1, 0, -2], 
                     [2, 2,  3]])
#>>> False

令人惊讶的是,上面的测试用例为这个python 2.7编码返回True,有谁可以告诉我原因?

4 个答案:

答案 0 :(得分:3)

在i = 0且j = 0

时返回True

修改后的解决方案:

<div>
     <canvas id="6" height="50px" width="150px"></canvas>
</div>

答案 1 :(得分:2)

首次检查后,您的测试会立即返回。要测试矩阵是否是反对称的(偏斜对称),您需要继续检查,直到找到A[i][j] != -A[j][i]对(i,j)。

在Python中直接循环遍历容器中的项而不是使用索引几乎总是更好。要转置矩阵,我们可以使用内置的zip函数:

def is_antisymmetric(m):
    # Transpose matrix m
    t = zip(*m)

    #Check each row against each column
    for row, col in zip(m, t):
        #Test that each item in the row is the negative 
        # of the corresponding column item
        for u, v in zip(row, col):
            if u != -v:
                return False
    return True

# Test

data = (
    # Not anti-symmetric
    [[0, 1, 2],
    [-1, 0, -2],
    [2, 2, 3]],

    # Anti-symmetric
    [[0, 1, 2],
    [-1, 0, -2],
    [-2, 2, 0]],
)

for m in data:
    for row in m:
        print(row)
    print(is_antisymmetric(m))

<强>输出

[0, 1, 2]
[-1, 0, -2]
[2, 2, 3]
False
[0, 1, 2]
[-1, 0, -2]
[-2, 2, 0]
True

我们可以通过在all函数中使用生成器表达式来使函数更紧凑:

def is_antisymmetric(m):
    return all([-u for u in col] == row for row, col in zip(m, zip(*m)))

all函数一找到与相应列不相等的行就会停止测试。并且==测试也会在找到不匹配时立即停止将当前行与当前列进行比较,因此此代码与早期版本相同,只是它的效率更高一些。但是,如果您不习惯生成表达式,则可能不容易阅读。 :)

FWIW,本答案中的所有代码都在Python 2和Python 3上运行,它处理任意大小的方阵。

答案 2 :(得分:1)

在i = 0时返回True,j = 0直到结束

才执行循环

答案 3 :(得分:1)

我想这是因为你在第一次测试后从函数返回。 您可能希望在您排除矩阵反对称的可能性之后才返回。 IE浏览器。 onley在循环内返回false,并在循环运行后返回true。