簡體   English   中英

麻煩用Python中的矩陣

[英]Trouble with matrix in Python

我正在嘗試將我的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()

這段代碼以一種好奇的方式構建,這使得難以理清究竟發生了什么。

您的錯誤的來源是obj.Matriz是一個元組,其中包含兩個長度為1的列表,而不是Lado by Lado by array。 如果你打印出obj.Matriz你會得到([5], [5]) (如果Lado == 5 )。

嘗試更像的東西

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

這將給你Lado列表的長度Lado填充0 如果你正在做數字工作,你可能也想看看numpy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM