2

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

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,而所有其他值都应该等于 0。如果不给我答案,有人可能会把我推向正确的方向吗?我一直在尝试解决这个问题大约 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

4 回答 4

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]]
于 2012-11-10T17:18:25.143 回答
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在条件句中(并且ofc不要忘记分别更改它们)以及return True最后如果您没有发现任何错误。

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

于 2012-11-10T18:15:32.267 回答
0

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

于 2012-11-10T18:19:37.860 回答
-1

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

于 2012-11-10T16:56:26.283 回答