2013-12-12 28 views
5

Geçerli bir JSON dosyası okuyorum (yuvalanmış 5 seviye derinlik), ardından bazı veriler ekliyorum ve daha sonra bazı hesaplamalar için bu verileri kullanmaya çalışıyorum.Rastgele "int abonelik değil" davranışı

int is not subscriptable hataları rastgele bir şekilde alıyorum. Kafamı etrafına dolamıyorum. str() için döküm yardımcı olmadı, pprint ile yazdırma, onu hafifletmek değil, girişte int() için yardımcı da yardımcı olmaz. Umutsuzca

ana işlevi ... seçenekler tükeniyor

with open(rNgram_file, 'r', encoding='utf-8') as ngram_file: 
    data = json.load(ngram_file) 
    data = rank_items(data) 
    data = probability_items(data) 
tüm değerler 5-yuvalanmış seviyede sayılır ve eklenir (veri)

rank_items ağacın içinde yukarı doğru çalışıyor. Girişe int() dökümünü olası bir çözüm olarak ekledim, ancak bu yardımcı olmadı. mesele hataları meydana burasıdır

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 (veri) alma ile ortaya çıkar. Görünüşe göre rastgele, x_rank veya x_grams['rank]type() ile ((eğer çalışırsa, <class 'int'> diyor) aşağıdaki gibi en yaygın satırları işaretlemiş olsalar bile yazdırılıyor veya atanıyorlar int is not subscriptable hakkında şikayette bulunacaklar. Tuhaftır ki hat 2 ve 3 randowm tarzda

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 

bir istisna yukarıda yaygın hata noktasında atılır ... bir istisna olmadı. Bu istisnalar nedeniyle, aşağıdaki satırlara asla ulaşılamamıştır. Ancak ortak hata noktalarını silerseniz, aşağıdaki satırlar hata noktaları olur. Ve bazen, tüm içten-içe döngü içinde, bir değerlendirme istisnasında duruncaya kadar değerlendirildiğinde, <class 'int'> yazdırma işlemini gerçekleştirir.

Bu hata burası tuhaf bir konu olduğundan i Type()

ile değerlendiriyorum oluşabilir nasıl ben bile anlamıyorum, hiçbir ipucu ne oluyor var ve açıkçası garip hata yapıyorum Tüm kodu buraya koydum: https://gist.github.com/puredevotion/7922480

Birisi size yardımcı olabilir!

traceback probability_items üstünde 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 (veri) hattı için

['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 detayları (veri)

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

Komple stacktrace verebilir misiniz? – thefourtheye

+0

@thefourtheye, yayınları şimdi (http://docs.python.org/3.3/library/traceback adresinden tb koduyla ödünç aldı) düzenledi.html) – puredevotion

+0

Öneri: pprint'i her yaptığınızda (type (x_grams ['_ rank'])) 'pprint (type (x_grams)) ile öncelikten sonra' 'x_grams 'türünde ne tür bir giriş yapmayı denediğinizi doğrulayın. o. Görünüşe göre, kodda sadece bir dict atamak istediğin x_grams değerlerinden birine int a atadığın bir yer var gibi görünüyor, ama nerede olduğu belli değil. –

cevap

4

Sorun, çok düzeyli bir iç içe geçmiş sözlüğe sahip olmanız ve yuvalama biraz farklı olmasına rağmen, aynı üç düzeyde tüm için aynı kodu çoğaltmanızdır.

Sadece

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

Sizin üst düzey sözlüğü (anahtar aesthetic için) değeri olarak tekdüze olan sözlüğünüze bir kısmını alacağım hep bir sözlük olduğunu. Ancak alt seviyeler de değerlerinden bazıları olarak ints'a sahiptir.

Eğer

for ngram, one_grams in data.items(): 

yaparsınız

int(one_grams['_rank']) 

değer sözlüğü elemanı _rank olduğu gibi her zaman (çalışacak. Burada bir hata asla Yani.

ngram=aesthetics ve one_grams={the dictionary} sahip Böylece zaman

Şimdi bir sonraki adıma geçiyoruz

one_gram, two_grams in one_grams.items() 

one_grams sözlük için .items() Koşu

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

Bildirimi two_grams ilk giriş için bir int ve saniye bir dict olduğunu verir.

two_grams['_rank'] 

yaparken siz) (tüm öğeler üzerinde yineleme beri (dict bekleniyordu açarken bir int ulaştığınız anlamına söyler) hata çalıştırın. Aynı problem iç döngülerde de ortaya çıkar.

Sözlükler sipariş edilmediğinden, öğeler() herhangi bir sırada döndürebilir. Böylece _rank, ilk eleman veya diğer sözlük öğelerinin altında olabilir. Bu durumda döngüler için iç tarafa iner ve aynı problemle karşılaşırsınız. tüm döngüler içinde

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

yineleme sırasında

Sen _rank tuşları ihmal edebilirsiniz.

+0

Zaten bunun 'ngram! =' _rank ': 'ile kapsanmış olmasına rağmen. Çok teşekkürler! – puredevotion

+1

@puredevotion Buna şu şekilde bakın: bir_gram için döngüde bir noktada, bir_gramda iki_gramsitem(): '' bir_gram''' '' _rank’' ve 'two_gram'' bir int. Ancak, pprint (tür (two_grams ['_ rank'])) 'i çağırıp aramadığınızı kontrol etmeden önce diyorsunuz. –

İlgili konular