麻烦用Python中的矩阵

时间:2013-02-09 20:52:38

标签: python class methods matrix outofrangeexception

我正在尝试将我的Java类转录为Python。最后一个是Warshall算法,但是当我运行应用程序时,我得到了这个错误:

C:\Python33\python.exe C:/Users/Joloch/PycharmProjects/Varios/Warshall.py
Inserte un valor para n (la matriz será cuadrada, por lo que es nxn):
3
Inserte un dato en la posición 0 0 :
Inserte un dato en la posición 0 1 :

Traceback (most recent call last):
  File "C:/Users/Joloch/PycharmProjects/Varios/Warshall.py", line 93, in <module>
    Warshall().main()
  File "C:/Users/Joloch/PycharmProjects/Varios/Warshall.py", line 59, in main
    obj.Matriz[x][y] = Dato
IndexError: list assignment index out of range

Process finished with exit code 1

这是代码,如果你能告诉我我做错了什么,我非常感激:

from Tools.Scripts.treesync import raw_input

class Warshall(object):
    pass

    Matriz = [],[]
    Lado = 0

    def __init__(self):
        return

    @classmethod
    def Funcion(self, A, B, C):
        if ((self.Matriz[A][B] == 1) ^ (self.Matriz[A][C] == 1) & (self.Matriz[C][B] == 1)):
            return 1
        else:
            return 0

    def main(self):
        obj = Warshall()
        Dato = 0
        x = 0
        y = 0
        z = 0
        Uno = 0
        Dos = 0
        Tres = 0
        Cuatro = 0
        print("Inserte un valor para n (la matriz será cuadrada, por lo que es nxn): ")
        obj.Lado = int(raw_input(""))
        obj.Matriz = [obj.Lado],[obj.Lado]
        while x < obj.Lado:
            while y < obj.Lado:
                print("Inserte un dato en la posición", x, y,": ")
                try:
                    Dato = int(raw_input())
                except TypeError:
                    print()
                obj.Matriz[x][y] = Dato
                y += 1

            while z <= obj.Lado - 1:
                while Uno <= obj.Lado - 1:
                    while Dos <= obj.Lado - 1:
                        obj.Matriz[Uno][Dos] = obj.Funcion(Uno, Dos, z)
                        Dos += 1
                    Uno += 1
                z += 1

            print()
            print("Matriz de adyacencia correspondiente: ")

            while Tres < obj.Lado:
                while Cuatro < obj.Lado:
                    print(obj.Matriz[Tres][Cuatro])
                    print()
                    Cuatro += 1
                Tres += 1

if __name__ == '__main__':
    Warshall().main()

1 个答案:

答案 0 :(得分:2)

这段代码以一种好奇的方式构建,这使得很难理清究竟发生了什么。

您的错误来源是obj.Matriz是一个元组,其中包含两个长度为1的列表,而不是您期望的LadoLado数组。如果您打印obj.Matriz,您将获得([5], [5])(如果Lado == 5)。

尝试更像

的内容
obj.Matriz = [[0 for j in range(obj.Lado)] for k in range(obj.Lado)]

这将为您提供LadoLado列表,其中0填充numpy。如果您正在进行数字工作,您可能也想查看{{1}}。