为什么我得到TypeError:需要一个整数?

时间:2016-07-14 17:27:31

标签: python

这是我的代码片段,其中回溯调用显示错误:

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类型。

请帮忙。

修改

这是我的全部代码:

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

的可下载链接

1 个答案:

答案 0 :(得分:0)

map_letter_to_pos尝试修改全局变量keyList而不将其指定为全局变量,因此它只修改keyList的本地副本,然后将其丢弃。这会导致next_val没有任何迭代,所以它永远不会到达if elif,并返回None。

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