2016-08-25 8 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 

驚くべきことに、上記のテストケースは、このPython 2.7コーディングに対してTrueを返します。なぜ誰かに私の理由を教えてもらえますか?このPython-2.7テストケースがなぜTrueを返すのですか?

+0

最初のものは0です。 – muddyfish

+2

0 == -0と世界は期待どおりに動作します。 –

+0

A [0] [0] == 0のためA [0] [0] == -A [0] [0] – tianwei

答えて

1

あなたは私= = 0 0 jのループが終了

1

まで実行されていないで、私はあなたが最初のテストの後に関数から返すので、それがあると思いTrueを返します。 あなたはおそらく、行列が逆対称である可能性を除外することができる場合にのみ、戻りたいと思うでしょう。つまりonleyはループ内でfalseを返し、ループが実行された後にtrueを返します。

+0

あなたはもっと自信を持って答えを述べるべきです! 「私が推測する」とか「おそらく」とは言わないでください。そして、スペルチェッカーを使用してください。 :) –

3

は、それは、私= 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]になるまで検査を続ける必要があります。

ほとんどの場合、インデックスを使用するのではなく、コンテナ内の項目を直接ループする方がよいでしょう。行列を転置するために、我々はビルトイン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で動作し、任意のサイズの正方行列を処理します。

関連する問題