Python代码效率

Abr*_*han 2 python matrix

该程序测试矩阵是否是单位矩阵.

我已将代码粘贴在下面,并想知道如何优化此代码的效率.另外我是python编程的新手,是否有一些内置函数可以解决这个问题呢?

    def is_identity_matrix(test):
    if (test == []):
        return False
    i = 0
    while (i < len(test)):
        if (len(test[i]) == len(test)):
            j = 0
            while(j < len(test[i])):
                if (j != i):
                    if(test[i][j] != 0):
                        return False
                else:
                    if(test[i][j] != 1):
                        return False
                if(j == (len(test[i]) - 1)):
                    break
                j += 1
            if(i == (len(test) - 1)):
                break
            i += 1
        else:
            return False
    if(i == j and i == (len(test) - 1)):
        return True

# Test Cases:

matrix1 = [[1,0,0,0],
           [0,1,0,0],
           [0,0,1,0],
           [0,0,0,1]]
print is_identity_matrix(matrix1)
#>>>True

matrix2 = [[1,0,0],
           [0,1,0],
           [0,0,0]]

print is_identity_matrix(matrix2)
#>>>False

matrix3 = [[2,0,0],
           [0,2,0],
           [0,0,2]]

print is_identity_matrix(matrix3)
#>>>False

matrix4 = [[1,0,0,0],
           [0,1,1,0],
           [0,0,0,1]]

print is_identity_matrix(matrix4)
#>>>False

matrix5 = [[1,0,0,0,0,0,0,0,0]]

print is_identity_matrix(matrix5)
#>>>False

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

print is_identity_matrix(matrix6)
#>>>False
Run Code Online (Sandbox Code Playgroud)

Jan*_*ila 13

def is_identity_matrix(listoflist):
    return all(val == (x == y) 
        for y, row in enumerate(listoflist)  
            for x, val in enumerate(row))
Run Code Online (Sandbox Code Playgroud)

(但是,这不检查矩阵是否为正方形,并且对于空列表返回True)

说明:在内部,all我们有一个带有嵌套循环的生成器表达式,其中val循环遍历矩阵中的每个值.x == y评估True对角线和False其他地方.在Python,True == 1False == 0,这样你可以比较val == (x == y).括号很重要: val == x == y将是一个相当于的链式比较val == x and x == y

  • 我认为我需要仔细考虑这个问题大约整整一分钟才能确定它似乎能起作用.最终,我认为这值得赞扬(以及一个upvote)因为能够在短蟒蛇行为中完成纯粹蟒蛇中不太丑陋的单线程. (2认同)
  • 我认为`val == 1 for ... for ... if x == y`会更清楚.我有时也会使用布尔值作为整数,但通常情况下并不是很明显. (2认同)
  • @delnan:但你还必须验证`val == 0`其中`x!= y`!所以最后我不确定Janne的答案能否真正得到改善. (2认同)

mgi*_*son 6

我用的是numpy:

(np.array(matrix1) == np.identity(len(matrix1))).all()
Run Code Online (Sandbox Code Playgroud)

当然,如果你首先存储matrix1为一个numpy数组以避免转换,那会更好.

  • @AbrarKhan - 它不在标准库中,但它是一个非常常见的第​​三方扩展,因为它非常有用. (3认同)