2013-12-12 33 views
5

我正在讀取有效的JSON文件(嵌套5層深),然後向其中添加一些數據,然後嘗試使用該數據進行一些計算。隨機「int不可下標」行爲

我得到int is not subscriptable隨機錯誤。我無法把頭圍住它。鑄造到str()沒有幫助,用pprint打印並沒有緩解它,鑄造到int()輸入也沒有幫助。我拼命地跑出來的選項...

主要功能

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(數據)

所有值都在5嵌套級別數,並添加在樹上向上工作。我將int()轉換爲輸入作爲可能的解決方案,但這並沒有幫助。 與獲得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(數據)出現該問題的

這是發生的錯誤在哪裏。看似隨意,它會抱怨int is not subscriptable,其中x_rankx_grams['rank]正在打印或分配,即使他們的評估與type()(如果它的工作,說<class 'int'>) 我標記最常見的線以下注釋。 古怪的是,2號線和3不會拋出一個異常...

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 

在randowm時尚,一個異常被拋出以上的常見錯誤點。由於這些例外,下面的行永遠不會到達。但是,如果刪除常見錯誤點,則下面的行將成爲錯誤點。 有時候,它在內部for循環中完成全部運行,在評估時打印<class 'int'>,以及全部,直到它停在異常處。

我不知道發生了什麼,我甚至不知道當我和Type()

評估它,因爲這是一個奇怪的問題怎麼能發生這種錯誤,而且我明明做一個奇怪的錯誤,我把所有的代碼放在這裏:https://gist.github.com/puredevotion/7922480

希望有人能幫助!

回溯詳細

['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 

回溯爲線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(數據)在probability_items的頂部(數據)

{'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

你可以給完整的堆棧跟蹤嗎? – thefourtheye

+0

@thefourtheye編輯帖子,現在追蹤回溯(從http://docs.python.org/3.3/library/traceback借用tb代碼。html) – puredevotion

+0

建議:每次你在'pprint(type(x_grams))'''前面​​加'pprint(type(x_grams ['_ rank']))''以驗證'x_grams'是什麼類型,然後再嘗試下標它。看起來好像在代碼中有一些地方將int分配給其中一個'x_grams'值,你只能指定一個字典,但不清楚它在哪裏。 –

回答

4

問題是,你有一個多級嵌套字典,儘管嵌套有些不同,但你爲所有三個級別複製相同的代碼。

我只是把你的字典裏的某些部分

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

你頂級的字典是一致的值(關鍵aesthetic)是總是字典。但是較低的水平也有ints作爲他們的一些價值。

因此,當你做

for ngram, one_grams in data.items(): 

你有ngram=aestheticsone_grams={the dictionary}

int(one_grams['_rank']) 

永遠是可行的(如值字典裏的元素_rank,所以你永遠不會得到一個錯誤。

現在我們進入下一步

one_gram, two_grams in one_grams.items() 

運行.items()one_grams詞典提供

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

通知two_gramsint用於第一條目和所述第二一個dict。既然你遍歷整個項目(),而這樣做

two_grams['_rank'] 

你遇到錯誤(這告訴你,你已經打了一個intdict預期)。內環中也會出現同樣的問題。

由於字典沒有排序,所以items()可以以任何順序返回。因此_rank可能是第一個元素或下面的其他字典元素。在這種情況下,你會進入循環的內部並在那裏遇到同樣的問題。

可以忽略_rank鍵,而在所有的循環迭代

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

+0

雖然我已經用'if ngram!='_rank'覆蓋了':但顯然不是。非常感謝! – puredevotion

+1

@puredevotion用這種方式來看看:在循環的某一點,對於one_gram,one_grams.items()中的two_grams:'你會發現'one_gram'是''_rank'','two_grams'是一個int。但是,即使檢查是否確定,你也可以調用'pprint(type(two_grams ['_ rank']))'。 –