2016-08-25 91 views
-3
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 

令人惊讶的是上面的测试情况下返回True对于这条巨蟒2.7编码,谁能告诉我原因吗?为什么这个python-2.7测试用例返回True?

+0

因为第一件事的0 – muddyfish

+2

0 == -0和世界按预期工作。 –

+0

A [0] [0] == -A [0] [0],因为A [0] [0] == 0 – tianwei

回答

1

你在我返回True = 0 J = 0循环不直到

1

我想这是因为你从函数的第一次测试后,退还结束时执行。 只有当您可以排除矩阵反对称的可能性后,您才可能想要返回。 IE浏览器。 onley在循环中返回false,并在循环结束后返回true。

+0

你应该更加自信地陈述你的答案!不要说“我猜”和“可能”。并使用拼写检查器。 :) –

3

它是在I = 0和j = 0

改性溶液返回true:

def antisymmetric(A): 
    for i in range(3): 
     for j in range(3): 
      if A[i][j] != -A[j][i]: 
       return False 
    return True 
2

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

它几乎总是更好的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函数只要发现ar就停止测试这不等于相应的列。 ==测试还会在发现不匹配时立即停止将当前行与当前列进行比较,因此该代码与早期版本相同,只是效率更高一些。但是,如果您不习惯生成表达式,那么读起来可能不那么容易。 :)

FWIW,都在这个答案的代码运行在Python 2和Python 3中,它处理任何规模的方阵。

相关问题