试图理解嵌套循环,单位矩阵

时间:2012-11-10 16:46:55

标签: python

所以我被困在嵌套循环上,我觉得我大概一半时间理解它们然后我开始处理不同的问题然后我不再理解它们了。也许我过度复杂化了。无论如何回到我的问题,我有一个单位矩阵

lst = [[1,0,0], [0,1,0], [0,0,1]]

我正在尝试编写一个程序来检查它是否是一个单位矩阵,所以我知道i和j的索引具有相同的索引(即i位于0位置,j位于0位置; i在位置1和j在位置1; i在位置2和j在位置2)并且等于1然后矩阵是单位矩阵。现在我的问题是我觉得我很难将其表达到计算机上。或者换句话说,lst[0][0], lst[1][1] and lst[2][2]应该都等于1,所有其他值应该等于零。没有给我答案,有人可能会推动我朝着正确的方向前进吗?我一直试图解决这个问题大约2个星期了,因为看起来很简单所以我感到很沮丧...

感谢。

def identity(lst):
for i in lst:
    for j in i:
        if i == j and lst[i][j] == 1:
                if i != j and lst[i][j] == 0:
                    return True

return False

我错了哪里出错?

我想我明白了!

def identity(lst):
size = len(lst)
for i in range(len(lst)):
    if len(lst[i]) != size:
        return False
    for j in range(len(lst)):
        if i == j and lst[i][j] != 1:
            return False
        elif i != j and lst[i][j] != 0:
            return False

return True

打印i和j:

for i in range(len(lst)):
     for j in range(len(lst)):
         print("i:", i, "j:", j)

导致:

i: 0 j: 0
i: 0 j: 1
i: 0 j: 2
i: 1 j: 0
i: 1 j: 1
i: 1 j: 2
i: 2 j: 0
i: 2 j: 1
i: 2 j: 2

这对我帮助很大!

4 个答案:

答案 0 :(得分:1)

既然你要使用很多东西,你可以把它变成一个类。

class Identity3(object):
  matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
  def __eq__(self, other):
    return self.matrix == other
  def __new__(self):
    return [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
  def __init__(self):
    pass

尝试使用它,

>>> translate = [[1, 0, 0], [0, 1, 0], [1, 1, 1]]
>>> translate == Identity()
False
>>> idmatrix = Identity()
>>> idmatrix
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

答案 1 :(得分:1)

首先,你的缩进似乎被打破了。你应该总是正确地缩进,尤其是在python中。它应该是:

def identity(lst):
    for i in lst:
        for j in i:
            if i == j and lst[i][j] == 1:
                if i != j and lst[i][j] == 0:
                    return True
    return False

其次,您没有以您认为的方式访问元素。如果我继续在你的循环内打印:

for i in lst:
    for j in i:
        print "i:", i, "j:", j
    print

我明白了:

i: [1, 0, 0] j: 1
i: [1, 0, 0] j: 0
i: [1, 0, 0] j: 0

i: [0, 1, 0] j: 0
i: [0, 1, 0] j: 1
i: [0, 1, 0] j: 0

i: [0, 0, 1] j: 0
i: [0, 0, 1] j: 0
i: [0, 0, 1] j: 1

如果需要迭代矩阵的索引,可以使用range(或xrange)和len函数的组合。

最后你的条件没有这种意义

if i == j and lst[i][j] == 1:
    if i != j and lst[i][j] == 0: # you never reach below here 
        return True               # because i == j is always true in here
                                  # provided by the first conditional

你需要分开这些条件。即使你这样做,你也会得到一个错误的答案,因为即使只有一个元素满足条件,它也会return True(即只有一个元素在正确的位置)。我相信你需要以相反的方式思考,return False在条件句中(并且不要忘记分别更改它们)和return True最后如果你找不到任何条件错误。

让我知道你是如何进步的,我可以给你更多提示..

答案 2 :(得分:0)

因为你不想要整个答案而只需要一个提示:对角线上的所有元素都应该是1;并且矩阵中所有元素的总和需要等于对角线的大小。

答案 3 :(得分:-1)

为了更具体一点,不要忘记检查是否i!= j,lst [i] [j] == 0。