2013-12-12 10 views
5

Czytam prawidłowy plik JSON (zagnieżdżone głęboko 5 poziomów), a następnie dodając do niej pewne dane, a następnie stara się wykorzystać te dane dla niektórych obliczeń.Random „int nie jest subscriptable” zachowanie

Dostaję int is not subscriptable błędów w sposób losowy. Nie mogę tego objąć. odlewanie do str() nie pomaga, drukowanie przy użyciu pprint nie zmniejsza jej, przesyłanie do int() na wejściu również nie pomaga. Ja rozpaczliwie ucieka opcji ...

Główną funkcją

with open(rNgram_file, 'r', encoding='utf-8') as ngram_file: 
    data = json.load(ngram_file) 
    data = rank_items(data) 
    data = probability_items(data) 

rank_items (dane)

Wszystkie wartości są liczone na poziomie 5-zagnieżdżonego i dodał działa w górę w drzewie. Dodałem rzutowanie int() do wejścia jako możliwe rozwiązanie, ale to nie pomogło. Ten problem występuje z coraz x_grams['_rank']

for ngram, one_grams in data.items(): 
     ngram_rank = 0 
     for one_gram, two_grams in one_grams.items(): 
      one_gram_rank = 0 
      [..] 
       for four_gram, values in four_grams.items(): 
       # 4gram = of, values = 34 
       three_gram_rank += values 
       four_grams['_rank'] = int(three_gram_rank) 
       two_gram_rank += three_gram_rank 
      [..]  
      two_grams['_rank'] = int(one_gram_rank) 
      ngram_rank += one_gram_rank 
     one_grams['_rank'] = int(ngram_rank) 

probability_items (dane)

To gdzie występują błędy. Pozornie losowo, będzie narzekać na int is not subscriptable, gdzie x_rank lub x_grams['rank] są drukowane lub przypisywane, nawet jeśli są oceniane za pomocą type() (które, jeśli działa, mówi <class 'int'>) I oznaczone najczęściej linii z komentarzem poniżej. wystarczająco Niesamowicie, linia 2 i 3 nie wyjątek ...

for ngram, one_grams in data.items(): 
     ngram_rank = int(one_grams['_rank'])    # never gives an error 
     print("NgramRank: ", str(ngram_rank))    # never gives an error 
     if ngram != '_rank': 
      for one_gram, two_grams in one_grams.items(): 
       pprint(type(two_grams['_rank']))    # common error point 
       one_gram_rank = str(two_grams['_rank'])  # never reaches this 
       if one_gram != '_rank': 
        for two_gram, three_grams in two_grams.items(): 
         pprint(type(three_grams['_rank'])) # common error point 
         pprint(str(three_grams['_rank'])) # never reaches this 
         two_gram_rank = str(three_grams['_rank']) 
         [..] 
        one_gram_prob = int(one_gram_rank)/int(ngram_rank) 
        two_grams['_prob'] = one_gram_prob 
      ngram_prob = int(ngram_rank)/int(ngram_rank) 
      one_grams['_prob'] = ngram_prob 

W randowm modzie, jest wyjątek na wspólnym punkcie błędu powyżej. Z powodu tych wyjątków poniższe wiersze nigdy nie zostały osiągnięte. Ale jeśli usuniesz typowe punkty błędów, poniższe wiersze staną się punktami błędu. Czasami wykonuje pełne przetwarzanie w pętli wewnętrznej, drukując <class 'int'> podczas oceniania i wszystkie, aż zatrzyma się na wyjątku.

nie mam pojęcia, co się dzieje, ja nawet nie rozumiem, jak ten błąd może wystąpić, gdy jestem oceniając go Type()

Ponieważ jest to dziwny problem, a ja oczywiście podejmowania dziwny błąd , Wpisałem tutaj cały kod: https://gist.github.com/puredevotion/7922480

Mam nadzieję, że ktoś może pomóc!

Traceback szczegóły

['Traceback (most recent call last):\n', ' File "Ngram_ranking.py", line 121, in probability_items\n pprint(type(four_grams[\'_rank\']))\n', "TypeError: 'int' object is not subscriptable\n"] 

*** extract_tb: 
[('Ngram_ranking.py', 121, 'probability_items', "pprint(type(four_grams['_rank']))")] 

*** format_tb: 
[' File "Ngram_ranking.py", line 121, in probability_items\n pprint(type(four_grams[\'_rank\']))\n'] 

*** tb_lineno: 121 
Exception in on line 121: pprint(type(four_grams['_rank'])): 'int' object is not subscriptable 

Traceback dla linii 115

['Traceback (most recent call last):\n', ' File "Ngram_ranking.py", line 115, in probability_items\n pprint(type(three_grams[\'_rank\']))\n', "TypeError: 'int' object is not subscriptable\n"] 

*** extract_tb: 
[('Ngram_ranking.py', 115, 'probability_items', "pprint(type(three_grams['_rank']))")] 

*** format_tb: 
[' File "Ngram_ranking.py", line 115, in probability_items\n pprint(type(three_grams[\'_rank\']))\n'] 

*** tb_lineno: 115 
Exception in on line 115: pprint(type(three_grams['_rank'])): 'int' object is not subscriptable 

pprint (dane) na górze probability_items (dane)

{'aesthetic': {'_rank': 290, 
      'feeling': {'_rank': 10, 
         'the': {'_rank': 10, 
           'feeling': {'_rank': 10, 'of': 10}}}, 
      'perception': {'_rank': 280, 
          'and': {'_rank': 190, 
            'the': {'_rank': 190, 
              'design': 15, 
              'environment': 5, 
              'music': 100, 
              'painting': 15, 
              'work': 5, 
              'works': 50}}, 
          'of': {'_rank': 90, 
           'the': {'_rank': 50, 
             'work': 30, 
             'world': 20}, 
           'their': {'_rank': 40, 'female': 40}}}}} 
+0

Czy możesz podać kompletny stacktrace? – thefourtheye

+0

@thefourtheye edytował post, teraz z tracebackami (zapożyczony kod tb z: http://docs.python.org/3.3/library/traceback.html) – puredevotion

+0

Sugestia: za każdym razem, gdy robisz 'pprint (type (x_grams ['_ rank']))' poprzedź go 'pprint (type (x_grams))' just, aby sprawdzić, jaki typ 'x_grams' jest przed próbą indeksu dolnego to. Wygląda na to, że w kodzie jest miejsce, w którym przypisujesz int jednej z wartości 'x_grams', w której masz na myśli tylko przypisanie dyktatury, ale nie jest jasne, gdzie. –

Odpowiedz

4

Problem polega na tym, że masz zagnieżdżony słownik wielopoziomowy i replikujesz ten sam kod dla wszystkich trzech poziomów, mimo że zagnieżdżanie jest nieco inne.

będę po prostu wziąć jakąś część słownika

{ 
'aesthetic': 
    { 
    '_rank': 290, 
    'feeling': 
     { 
     '_rank': 10, 
     'the': 
      { 
      '_rank': 10, 
      'feeling': 
       { 
       '_rank': 10, 
       'of': 10 
       } 
      } 
     }, 
    } 
} 

słownika górny poziom jest jednolity jako wartość (dla klucza aesthetic) jest zawsze słownikiem. Ale niższe poziomy mają także jedną z ich wartości: ints.

Zatem kiedy robisz

for ngram, one_grams in data.items(): 

masz ngram=aesthetics i one_grams={the dictionary}

int(one_grams['_rank']) 

zawsze będzie działać (jako słownika wartość ma element _rank. Więc nigdy nie pojawia się błąd tutaj.

Teraz przechodzimy do następnego kroku.

one_gram, two_grams in one_grams.items() 

Running .items() dla one_grams słowniku daje

(one_gram,two_grams) = [('_rank', 290), ('feeling', {'_rank': 10, 'the': {'_rank': 10, 'feeling': {'_rank': 10, 'of': 10}}})] 

Wskazówka two_grams jest int dla pierwszego wpisu i dict na sekundę. Od iteracyjne ciągu całych elementów() robiąc

two_grams['_rank'] 

napotkasz błędu (który mówi ci, że masz hit int gdy oczekiwano dict). Ten sam problem występuje w wewnętrznych pętlach.

Ponieważ słowniki nie są uporządkowane, pozycje() mogą być zwrócone w dowolnej kolejności. Zatem _rank może być pierwszym elementem lub poniżej innych elementów słownika. W takim przypadku zejdziesz do wnętrza pętli i napotkasz tam ten sam problem.

można zaniedbać _rank klawiszy podczas iteracji

for one_gram,two_grams one_grams.items(): 
    if one_gram=='_rank': 
     continue 

we wszystkich pętlach.

+0

Myślałem, że mam już to pokryte "if ngram! = '_rank": 'ale wyraźnie nie. Wielkie dzięki! – puredevotion

+1

@puredevotion Spójrz na to w ten sposób: w pewnym momencie pętli 'for one_gram, two_grams in one_grams.items():' przekonasz się, że 'one_gram' to' '_rank'', a 'two_grams' to int. Ale wywołujesz 'pprint (type (two_grams ['_ rank'])) zanim jeszcze sprawdzisz, czy jest. –

Powiązane problemy