2010-10-30 11 views
8

W Pythonie mam ten błąd:TypeError: 'int' obiekt jest unsubscriptable

TypeError: 'int' object is unsubscriptable 

Dzieje się tak na linii:

sectorcalc[i][2]= ((today[2]/yesterday[2])-1) 

nie mogłem znaleźć dobrą definicję unsubscriptable dla Pythona gdziekolwiek.

for quote in sector[singlestock]: 
     i+=1 
     if i < len(sector): 
      if i==0: 
       sectorcalc[i][0]= quote[0] 
       sectorcalc[i][2]= 0 
       sectorcalc[i][3]= 0 
       sectorcalc[i][4]= 0 
       sectorcalc[i][5]= 0 
       sectorcalc[i][6]= 0 
       sectorcalc[i][7]= 0 
      else:      
       yesterday = sector[singlestock-1][i] 

       print yesterday         

       today = quote 

       print type(today[2]) 
       sectorcalc[i][2]= ((today[2]/yesterday[2])-1) 
       sectorcalc[i][3]= (today[3]/yesterday[3])-1 
       sectorcalc[i][4]= (today[4]/yesterday[4])-1 
       sectorcalc[i][5]= (today[5]/yesterday[5])-1 
       sectorcalc[i][6]= (today[6]/yesterday[6])-1 
       sectorcalc[i][7]= (today[7]/yesterday[7])-1 

Co oznacza ten błąd?

+0

(Jak sugeruje @ duffymo :) Niezwiązane z błędem, powinieneś prawdopodobnie dodać więcej pętli;) – delnan

+0

Jeden z nich jest unsscriptable 1) sectorcalc [i] 2) dzisiaj, 3) wczoraj. Powiedziałeś już, że dzisiaj jest lista. Sprawdź inne. – pyfunc

+0

Dobra uwaga, tak naprawdę produkt mojego braku doświadczenia z pytonem nie ma normalnego dla pętli – b8b8j

Odpowiedz

14

"[2]" w dzisiejszym [2] nazywa się indeksem dolnym.

This usage is possible only if "today" is a sequence type. Native sequence types - List, string, tuple etc

Ponieważ otrzymujesz błąd - 'int' obiekt jest unsubscriptable. Oznacza to, że "dzisiaj" nie jest sekwencją, lecz obiektem typu int.

Będziesz musiał znaleźć/debugować, dlaczego "dzisiaj" lub "wczoraj" jest obiektem typu int, gdy spodziewasz się sekwencji.

[Edit: aby było jasne]

Error can be in

  1. sectorcalc [i]
  2. dzisiaj (Już udowodnił to lista)
  3. wczoraj
+0

Dzięki za pomoc, ale kiedy wydrukuję dzisiaj: ['AMGN', datetime.datetime (2009, 1, 5, 0, 0), 59.219999999999999, 59.649999999999999, 58.0, 59.649999999999999, 10940100.0, 59.649999999999999] to nie jest sekwencja? – b8b8j

+0

Linia przed tą, która się nie powiedzie ('typ wydruku (dzisiaj [2])') oczywiście działa poprawnie i indeksy "dzisiaj". Musi więc być indeksowalny. – delnan

+0

@ b8b8j: błąd może być taki, że "dzisiaj" lub "wczoraj" nie jest sekwencją. Błąd jest w linii i musisz ustalić, który z nich powoduje błąd. – pyfunc

2

To jest mylące do odczytu:

today = quote 

Czy today = datetime.date.today()? Dlaczego data nagle odnosi się do cytatu? Czy nazwa zmiennej to quoteForToday lub coś bardziej ekspresyjnego? To samo dla yesterday. Dzielenie dwóch dat tak jak Ty nie ma dla mnie sensu.

Ponieważ jest to quote, czy today i yesterday odnoszą się do cen lub stawek w różnych dniach? Imiona ważne - wybierz je ostrożnie. Możesz być tym, który musi zachować to przez sześć miesięcy, a także nie będziesz pamiętał, co one oznaczają.

Nie znaczy to, że kod, który napisałeś, jest ważny, ale nie rozumiem, dlaczego nie używałbyś pętli.

for j in range(2,7): 
    sectorcalc[i][j] = (today[j]/yesteday[j])-1 

zamiast

 sectorcalc[i][2]= ((today[2]/yesterday[2])-1) 
     sectorcalc[i][3]= (today[3]/yesterday[3])-1 
     sectorcalc[i][4]= (today[4]/yesterday[4])-1 
     sectorcalc[i][5]= (today[5]/yesterday[5])-1 
     sectorcalc[i][6]= (today[6]/yesterday[6])-1 
     sectorcalc[i][7]= (today[7]/yesterday[7])-1 
+0

innym rozwiązaniem jest użycie przypisania przekroju: 'sectorcalc [i] [2: 7] = [(t/y) - 1 dla t, y w zip (dzisiaj [2: 7] , wczoraj [2: 7])], jeszcze inną alternatywą jest zastąpienie jej nową listą (choć będzie to miało nieco inną wartość semantyczną): 'sectorcalc [i] = [quote [0], 0, 0, 0, 0, 0, 0] " –

1

Jak odtworzyć ten błąd:

myint = 57 
print myint[0] 

ludzie, którzy pisali kompilator powiedział, że nie można tego zrobić w następujący sposób:

TypeError: 'int' object is unsubscriptable 

Jeśli chcesz indeks czegoś użyć tablicę takiego:

myint = [ 57, 25 ] 
print myint[0] 

która drukuje:

57 

Rozwiązanie:

Albo promować swój int do listy lub innego typu indeksowanego lub przestań się indeksować r int.

Powiązane problemy