0

我正在尝试将我的 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()
4

1 回答 1

2

这段代码的结构,啊,奇怪的方式使得很难理清到底发生了什么。

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

尝试更多类似的东西

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

这将为您提供填充Lado的长度列表。如果你正在做数字工作,你可能也想研究一下。Lado0numpy

于 2013-02-09T21:02:45.070 回答