2012-06-25 12 views
29
import math 
import os 


class collection: 
    col = [[0 for col in range(5)] for row in range(6)] 
    dist = [[0 for col in range(6)] for row in range(6)] 
    filename = "" 
    result = "" 

    def __init__(self,arg1): 
     self.filename = arg1 

    def coll(self): 

     for i in range(6): 
      try: 
       if(i==0): 
        f = open(self.filename,'r') 
       elif(i==1): 
        f = open("chap1.txt",'r') 
       elif(i==2): 
        f = open("chap2.txt",'r') 
       elif(i==3): 
        f = open("chap3.txt",'r') 
       elif(i==4): 
        f = open("chap4.txt",'r') 
       elif(i==5): 
        f = open("chap5.txt",'r') 

       for j in range(5): 
        self.result = f.readline() 
        self.col[i][j] = self.result 
      finally: 
       print "file handling error" 

    def distance(self): 
     for i in range[6]: 
      for j in range[6]: 
       dis = 0 
       for k in range[5]: 
        dis += math.fabs((self.col[i][k]-self.col[j][k])*(j-i)) 
       self.dist[i][j] = dis 
       self.dist[i][i] = sys.maxdouble 
     return self.dist 

class profile: 
    dist = [[0 for col in range(6)]for row in range(6)] 
    filename = "" 
    pque = [[0 for col in range(6)]for row in range(6)] 
    d = [[0 for col in range(6)]for row in range(6)] 
    par = [[0 for col in range(6)]for row in range(6)] 
    st = 0 

    def __init__(self,arg1): 
     self.filename = arg1 

    def begin(self): 
     ob = collection(self.filename) 
     ob.coll() 
     dist = ob.distance() 

    def sssp(self): 
     for i in range(6): 
      pque[i] = sys.maxdouble 
      d[i] = sys.maxdouble 
     d[0] = 0 
     pque[0] = 0 

     while isempty()==0: 
      u = extract_min() 
      for i in range(6): 
       if d[i]>d[u]+dist[u][i]: 
        d[i] = d[u]+dist[u][i] 
        pque_deckey(i,d[i]) 
        par[i]=u 
       if u!=0: 
        print u 
      print "\n" 
      for i in range(6): 
       print par[i] 

    def extract_min(): 
     ret = 0 
     shift = 0 
     minimum = pque[0] 

     for i in range(6): 
      if pque[i]<minimum: 
       minimum = pque[i] 
       ret = i 
     pque[ret] = sys.maxdouble 
     return ret 

    def isempty(self): 
     count = 0 
     for i in range(6): 
      if pque[i] == sys.maxdouble: 
       count=count+1 
     if count==6: 
      return 1 
     else : 
      return 0 

    def pque_deckey(self,im,di): 
     pque[im]=di 

class main: 
    filename = raw_input("enter name of student:\n") 
    filename = filename + ".txt" 
    if(os.path.exists(filename)==1): 
     f = file(filename,"r") 
    else: 
     f = file(filename,"w+") 
     att1 = raw_input("att1 score:\n") 
     att2 = raw_input("att2 score:\n") 
     att3 = raw_input("att3 score:\n") 
     att4 = raw_input("att4 score:\n") 
     att5 = raw_input("att5 score:\n") 
     f.write(att1) 
     f.write("\n") 
     f.write(att2) 
     f.write("\n") 
     f.write(att3) 
     f.write("\n") 
     f.write(att4) 
     f.write("\n") 
     f.write(att5) 
     f.write("\n") 
    stud = profile(filename) 
    stud.begin() 
    stud.sssp() 

to pokazuje błąd wykonania:„int” obiekt ma atrybut „__getitem__”

File "C:\Python27\winculum.py", line 33, in coll 
    self.col[i][j] = self.result 
TypeError: 'int' object has no attribute '__getitem__' 

jestem tylko początkującym w Pythonie, a ja jestem w stanie naprawić to nawet po wyszukaniu w internecie .

+0

To dużo kodu. W każdym razie, twój problem polega na tym, że używasz 'col' jako iteratora w twoich listach, i jest on w tym samym zakresie, co zewnętrzne' col', więc jest nadrzędne. Po prostu zmień 'col' wewnątrz pojmowania na coś innego. – cha0site

+0

cześć !! dziękuję za cenne rady .. zadziałało C –

Odpowiedz

44

Błąd:

'int' object has no attribute '__getitem__' 

oznacza, że ​​próbujesz zastosować operator indeksu [] na zasadzie int, a nie lista. A więc col nie jest listą, nawet gdy powinna być? Zacznijmy od tego.

Spójrz tutaj:

col = [[0 for col in range(5)] for row in range(6)] 

Użyj innej nazwy zmiennej wewnątrz, wygląda lista zrozumienie nadpisuje zmienną col podczas iteracji. (Nie podczas iteracji po ustawieniu col, ale w ciągu następnych nich.)

+0

dzięki za poradę ... czy możesz mi powiedzieć, jak przypisać maksymalną wartość podwójną do zmiennej? –

+0

Skorzystaj z http://docs.python.org/library/sys.html#sys.float_info (po prostu całkiem googotowałem) – Kos

2

Niektóre problemy:

for i in range[6]: 
      for j in range[6]: 

powinno być:

range(6) 
4

Ten błąd może być wskazówką, że zmienna o tej samej nazwie, zostały wykorzystane w kodzie wcześniej, ale dla innych celów. Możliwe, że zmienna otrzymała nazwę, która współwystępuje z istniejącą funkcją używaną później w kodzie.

Powiązane problemy