0

I'm trying to transcribe my Java classes to Python. The last one was the Warshall Algorithm, but when I run the aplication, I get this error:

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

This is the code, I appreciate a lot if you can tell me what I'm doing wrong:

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

このコードは、ああ、奇妙な方法で構造化されており、正確に何が起こっているのかを整理するのが難しくなっています。

あなたのエラーの原因は、あなたが期待するby by配列obj.Matrizではなく、2つの長さ1のリストを持つタプルです。印刷すると(if )が得られます。 LadoLadoobj.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 に答える