2013-02-09 2 views
0

Я пытаюсь расшифровать мои классы Java на Python. Последний из них был Воршалла алгоритм, но когда я бегу-анкету, я получаю эту ошибку:Проблема с матрицей в Python

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() 
+0

Хммм ... Почему вы a) пытаетесь определить '__init__', когда вы ничего не делаете в этом методе, и б) почему ваша' main() 'функция * внутри * вашего класса? –

+0

a) Привычка, я обычно помещаю конструктор в каждый класс, где я использую методы. b) Я новичок в Python, поэтому я подумал, что это может быть как Java, потому что я видел пару примеров с основными методами. –

ответ

2

Этот код структурирован в a, ah, любопытном способе, который затрудняет определение того, что именно происходит.

Источник вашей ошибки в том, что obj.Matriz является кортежем с двумя длинными 1 списком в нем, а не Lado от Lado от массива, как вы ожидаете. Если вы распечатаете 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.

+0

Та же ошибка, но теперь в этой строке: 'if ((self.Matriz [A] [B] == 1)^(self.Matriz [A] [C] == 1) & (self.Matriz [ C] [B] == 1)): ' Возможно, причиной являются символы^и & ... в моем классе Java, что строка: ' if ((Matriz [K] [Q] == 1) || ((Matriz [K] [J] == 1) && (Matriz [J] [Q] == 1))) ' Какие операторы похожи на« && »и« || »? –

+0

1) Невозможно прочитать код в комментариях 2) 'и' и' или' и 3), что является достаточно различным вопросом, и вы должны начать новый вопрос. – tacaswell

Смежные вопросы