有人能告诉我为什么这段代码没有按预期工作?

时间:2014-05-28 14:19:20

标签: python nltk

def ethos(file):
    """Open a local file, convert its content into tokens.Match tokens with list provided, return matching list."""
    f = open(file)
    raw = f.read()
    tokens = nltk.word_tokenize(raw)
    list = [ 'perfect' ,'companion' , 'good' , 'brilliant', 'good']
    for tokens in list:
        return tokens

我写了这段代码的想法是它应该返回文本中与定义的列表匹配的所有标记,但是它只返回一个标记,而且也只返回列表开头的标记 我也尝试添加并清空列表并附加匹配的单词,但似乎没有用,所以如果有任何想法有任何想法,请告诉我,请尽快回复

2 个答案:

答案 0 :(得分:1)

这里有一些问题,但重点是函数只会执行它遇到的第一个return。所以你循环遍历列表中的每个项目,并return第一个 - 此时函数停止执行,因为它返回了。

我认为您想要的是检查文本中的每个单词以查看它是否在您的列表中,然后返回所有匹配的单词。要做到这一点,你需要在某个地方实际进行比较,这是你目前没有做的。你可能会重写你的循环看起来像这样:

# Don't use "list" as a variable name! Also, there's no need for two "good" entries.
words_to_match = ['perfect' ,'companion' , 'good' , 'brilliant']

matching_tokens = []
for token in tokens:
    if token in words_to_match:
        matching_tokens.append(token) # add the matching token to a list
return matching_tokens # finally, return all the tokens that matched

一旦你理解了你在上面的显式循环中做了什么,请注意你可以将整个事情重写为一个简单的list comprehension

words_to_match = {'perfect' ,'companion' , 'good' , 'brilliant'} # using a set instead of a list will make the matching faster
return [t for t in tokens if t in words_to_match]

答案 1 :(得分:1)

我认为你打算这样做

return [i for i in tokens if i in list]

您编写它的方式,它将遍历list中的每个单词。但它在循环中做的第一件事是return。所以它所做的就是每次都返回'perfect'这个词,不管tokens中的内容是什么。所以修改后的代码(假设其他所有功能都正确)将是

def ethos(file):
"""Open a local file, convert its content into tokens.Match tokens with list
    provided, return matching list."""
    f = open(file)
    raw = f.read()
    tokens = nltk.word_tokenize(raw)
    list = [ 'perfect' ,'companion' , 'good' , 'brilliant', 'good']
    return [i for i in tokens if i in list]

另外,一些杂项提示:

  
      
  1. 请勿将该变量命名为list,因为您是名字阴影
  2.   
  3. 您的变量list可能是set,那么您可以有O(1)个查找时间而不是O(N)
  4.