2012-06-25 35 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() 

che mostra un errore di runtime:oggetto 'int' non ha alcun attributo '__getitem__'

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

Io sono solo un principiante in pitone, e io sono in grado di porre rimedio a questa, anche dopo una ricerca in rete .

+0

Questo è un sacco di codice. Ad ogni modo, il tuo problema qui è che stai usando 'col' come iteratore nelle tue list comprehensions, ed è nello stesso scope del' col' esterno, quindi lo sta sovrascrivendo. Basta cambiare 'col' nelle comprensioni per qualcos'altro. – cha0site

+0

ciao !! grazie per il prezioso consiglio .. ha funzionato C –

risposta

44

L'errore:

'int' object has no attribute '__getitem__' 

significa che si sta tentando di applicare l'operatore di indice su un [] int, non una lista. Quindi col non è un elenco, anche quando dovrebbe essere? Iniziamo da quello.

Guardate qui:

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

Utilizzare un nome di variabile diverso all'interno, si presenta come la lista di comprensione sovrascrive la variabile col durante l'iterazione. (Non durante la iterazione quando si imposta col, ma durante i seguenti.)

+0

grazie per il consiglio ... puoi dirmi come assegnare il valore massimo del doppio a una variabile? –

+0

Usa http://docs.python.org/library/sys.html#sys.float_info (l'ho cercato facilmente su Google) – Kos

2

Alcuni dei problemi:

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

dovrebbe essere:

range(6) 
4

Questo errore potrebbe essere un'indicazione che variabile con lo stesso nome sono stati utilizzati nel codice precedente, ma per altri scopi. Probabilmente, a una variabile è stato assegnato un nome che è in coacervo con la funzione esistente utilizzata più avanti nel codice.

Problemi correlati