身份矩阵

时间:2015-10-15 15:23:49

标签: python python-2.x

当我学习python时,我遇到了一个问题,并且无法确定出现了什么问题。请查看下面的python代码。

def is_identity_matrix(matrix):
    n = len(matrix)
    if n != len(matrix[0]):
        return False
    i = 0
    while i < n:
        j = 0
        while j < n:
            if matrix[i][j] == matrix[i][i]:
                if matrix[i][j] != 1:
                    return False
            else:
                if matrix[i][j] != 0:
                    return False
            j+=1
        i+=1
    return True

matrix6 = [[1,0,0,0],  
           [0,1,0,1],  
           [0,0,1,0],  
           [0,0,0,1]]

print is_identity_matrix(matrix6)

这会输出True而不是False因为问题是要求我们检查单位矩阵,其中只有中间的对角线应该有1,其余的应该是0.自{{ 1}}不等于1,输出应为false。有人可以帮忙吗?非常感谢你!

3 个答案:

答案 0 :(得分:3)

就像hiro主角所说,问题在于:

if matrix[i][j] == matrix[i][i]:

您正在检查单元格的值是否与对角线上的值匹配,我假设您要检查对角线是否在对角线上。

该行应为:

if i == j:

答案 1 :(得分:2)

您应该比较i == j而不是matrix[i][j] == matrix[i][i]

此处的版本使用for代替while

def is_identity_matrix(matrix):
    n = len(matrix)
    if n != len(matrix[0]):
        return False
    for i in range(n):
        for j in range(n):
            if i == j:
                if matrix[i][j] != 1:
                    return False
            else:
                if matrix[i][j] != 0:
                    return False
    return True

甚至(使用product中的itertools)保存了缩进级别,看起来更具可读性:

from itertools import product

def is_identity_matrix(matrix):
    n = len(matrix)
    if n != len(matrix[0]):
        return False
    for i, j in product(range(n), range(n)):
        if i == j:
            if matrix[i][j] != 1:
                return False
        else:
            if matrix[i][j] != 0:
                return False
    return True

答案 2 :(得分:0)

如果你还没有学习范围(),就像我现在一样, 这是我的解决方案:

 var text = "HelloMy name is Bob"
 let regex = try! NSRegularExpression(pattern: "[a-z][A-Z]")
 text = regex.stringByReplacingMatches(in: text, options: [], range: NSMakeRange(0, text.characters.count-1), withTemplate: "What do I put here?")