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,有谁可以告诉我原因?
答案 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。