2016-07-14 3 views
-2

Это мой фрагмент кода, где вызов отслеживающий показывает ошибку:Почему я получаю TypeError: требуется целое число?

def categorize(title): 
    with conn: 
     cur= conn.cursor() 
     title_str= str(title) 
     title_words= re.split('; |, |\*|\n',title_str) 
     key_list= list(dictionary.keys()) 
     flag2= 1 
     for word in title_words: 
     title_letters= list(word) 
     flag1= 1 
     for key in key_list: 
      if key==title_letters[0]: 
       flag1= 0 
       break 

     if flag1== 0: 

     start=dictionary.get(title_letters[0]) 
     end= next_val(title_letters[0]) 

     for i in xrange (start,end): 
      if word==transfer_bag_of_words[i]: 
       flag2= 0 
       break 

     if flag2== 0: 
     cur.execute("select Id from articles where title=title") 
     row_id= cur.fetchone() 
     value= (row_id,'1') 
     s= str(value) 
     f.write(s) 
     f.write("\n") 
     break 

    return 


def next_val(text): 
    for i,v in enumerate(keyList): 
     if text=='t': 
     return len(transfer_bag_of_words) 
     elif v==text: 
     return dictionary[keyList[i+1]] 

Это вызов отслеживающий:

Traceback (most recent call last): 
File "categorize_words.py", line 93, in <module> 
query_database() 
File "categorize_words.py", line 45, in query_database 
categorize(row) 
File "categorize_words.py", line 67, in categorize 
for i in xrange (start,end): 
TypeError: an integer is required 

я не дал весь код здесь. Но я объясню, что я пытаюсь сделать. Я пытаюсь импортировать конкретное поле из базы данных sqlite и проверять, соответствует ли одно слово поля конкретному пакету слов, которые у меня уже есть в моей программе. Я отсортировал пакет слов в алфавитном порядке и назначил каждое начало нового письма индексу, используя словарь python. Это я сделал так, что каждый раз, когда я проверяю слово в поле, которое присутствует в сумке слов, мне не нужно перебирать весь пакет слов. Скорее, я могу просто начать цикл из индекса первой буквы слова.

Я проверил, что возвращаемый тип get() в словаре - это int, а функция nextVal также должна возвращать int, поскольку оба типа len() и dictionary [keylist [i + 1]] являются типами int.

Пожалуйста, помогите.

EDIT

Это весь мой код:

import sqlite3 as sql 
import re 

conn= sql.connect('football_corpus/corpus2.db') 

transfer_bag_of_words=['transfer','Transfer','transfers','Transfers','deal','signs','contract','rejects','bid','rumours','swap','moves', 
        'negotiation','negotiations','fee','subject','signings','agreement','personal','terms','pens','agent','in','for', 
        'joins','sell','buy','confirms','confirm','confirmed','signing','renew','joined','hunt','excited','move','sign', 
        'loan','loaned','loans','switch','complete','offer','offered','interest','price','tag','miss','signed','sniffing', 
        'remain','plug','pull','race','targeting','targets','target','eye','sale','clause','rejected', 
        'interested'] 

dictionary={} 
dictionary['a']=0; 
keyList=[] 
f= open('/home/surya/Twitter/corpus-builder/transfer.txt','w') 

def map_letter_to_pos(): 
    pos=0 
    transfer_bag_of_words.sort() 
    for word in transfer_bag_of_words: 
     flag=1 
     letters= list(word) 
     key_list= list(dictionary.keys()) 
     for key in key_list: 
     if key==letters[0]: 
      flag=0 
      break 

     if flag==1: 
     dictionary[letters[0]]=pos 
     pos+=1 
     else: 
     pos+=1 

    keyList= sorted(dictionary.keys()) 

def query_database(): 
    with conn: 
     cur= conn.cursor() 
     cur.execute("select title from articles") 
     row_titles= cur.fetchall() 

     for row in row_titles: 
     categorize(row) 

def categorize(title): 
    with conn: 
     cur= conn.cursor() 
     title_str= str(title) 
     title_words= re.split('; |, |\*|\n',title_str) 
     key_list= list(dictionary.keys()) 
     flag2= 1 
     for word in title_words: 
     title_letters= list(word) 
     flag1= 1 
     for key in key_list: 
      if key==title_letters[0]: 
       flag1= 0 
       break 

     if flag1== 0: 

     start=dictionary.get(title_letters[0]) 
     end= next_val(title_letters[0]) 

     for i in xrange (start,end): 
      if word==transfer_bag_of_words[i]: 
       flag2= 0 
       break 

     if flag2== 0: 
     cur.execute("select Id from articles where title=title") 
     row_id= cur.fetchone() 
     value= (row_id,'1') 
     s= str(value) 
     f.write(s) 
     f.write("\n") 
     break 

    return 


def next_val(text): 
    for i,v in enumerate(keyList): 
     if text=='t': 
     return len(transfer_bag_of_words) 
     elif v==text: 
     return dictionary[keyList[i+1]] 

if __name__=='__main__': 
    map_letter_to_pos() 
    query_database() 

И это загружаемая ссылка на файл базы данных http://wikisend.com/download/702374/corpus2.db

+2

Для этого требуется [mcve]. Если тип этих двух переменных действительно был int, это не будет проблемой. –

+0

@joelgoldstick Я не понимаю. Я предоставил часть кода, который дает ошибку –

+1

'start' и/или' end' не являются целыми числами. Я знаю, ты сказал, что проверил, что они есть, но ты ошибаешься. –

ответ

0

map_letter_to_pos пытается изменить глобальную переменную KeyList без указания его как глобальную переменную, поэтому она только модифицирует локальную копию keyList, а затем отбрасывает ее. Это приводит к тому, что next_val не имеет ничего для итерации, поэтому он никогда не достигает значения if elif и возвращает None.

end = None 
range(start,end) # None is not an int 
+0

также - busted. Вы были так уверены, что начало и конец интро, когда вы никогда не смотрели, и сообщение об ошибке ясно сказали вам, что это не так. :) –

Смежные вопросы