在Python列表中查找特定索引的值

时间:2017-06-07 08:46:21

标签: python list nltk

我有一个简单的python程序。

from nltk.tokenize import word_tokenize

negation ='no','not','never'.split(',')
list2 = 'miss,loss,gone,give up,lost'.split(',')
sentence = 'loss money'

if any(word in list2 for word in word_tokenize(sentence)) and (any(word in     
list2 for word in word_tokenize(sentence))[-1:])not in negation :
  print 'sad'
else:
  print 'not sad'

这个错误是

TypeError: 'bool' object has no attribute '__getitem__'

我需要的是,我想检查句子中的任何单词是否在list2中。如果是,那么想要检查它之前的索引值是否在否定列表中。如果是,它应该是"不悲伤"。

举个例子"我想念他"应该伤心,"我不会想念他"应该不会伤心。

任何人都可以帮助我!

2 个答案:

答案 0 :(得分:3)

对于初学者来说,你有很多问题:

  • 如果您要查看单词集,请使用集合,而不是列表。例如'give up'
  • any()永远不会被发现为句子中的标记。
  • listobj[-1:]返回一个布尔值(参见this question)了解其工作原理。
  • any()返回列表的切片,只包含最后一个元素
  • 您没有尝试从列表或容器中提取项目,因为for index, value in enumerate(var): last_word=var[index-1] if index > 0 else None 返回一个布尔值,您试图将布尔值视为容器。这就是造成您可以看到错误的原因。

我建议你将问题分解为更合乎逻辑的步骤,而不是直接跳到列表推导/生成器中 如果你想根据其他人的位置访问列表中的项目,我建议从索引for循环开始:

def sad_sentence(sentence):
    wordlist=sentence.split()
    negations={'no','not','never'}
    negphrases={'miss','loss','gone','give up','lost'}

    for index, word in enumerate(wordlist):
        last_word=wordlist[index-1] if index > 0 else None
        if word in negphrases:
            if last_word in negations:
                print 'not sad'
            else:
                print 'sad'
            break;
        print 'not sad'

只进行一次单词标记化操作,无需一遍又一遍地进行。

示例解决方案:

>>> sad_sentence("I am not gone")
not sad
>>> sad_sentence("I am not here I am gone")
sad
>>>

这导致:

{{1}}

答案 1 :(得分:2)

你没有写好if的第二部分。 首先看一下返回布尔值的any(word in list2 for word in word_tokenize(sentence))。然后你尝试提取这个返回错误的布尔值([-1])的最后一个元素。

此处无需使用nltk库,只需使用.split()即可:

negation ='no,not,never'.split(',')
list2 = 'miss,loss,gone,give up,lost'.split(',')

def f(sentence):
    if any(word in list2 for word in sentence.split()) and not any(word in negation for word in sentence.split()):
        print 'sad'
    else:
        print 'not sad'

l = ['loss money', 'I miss him', 'I not miss him']
for e in l:
    f(e)
# Outputs: sad / sad / not sad

编辑新版本要考虑@Baldrickk的好评。 我考虑了另外两个案例。它打印“快乐”#39;如果没有单词属于list2。如果多个单词属于list2,则会检查前一个单词,而不仅仅是第一个单词。

negation = {'no', 'not', 'never'}
list2 = {'miss', 'loss', 'gone', 'give up', 'lost'}

def f(sentence):
    s = sentence.split()
    l = [s.index(word) for word in s if word in list2]
    # Will returns list of indices (of sentence) where word is in list2
    if len(l) > 0:
        for e in l:
            # Check previous word
            if s[e-1] not in negation:
                print 'sad'
            else:
                print 'not sad'
    else:
        print 'happy'

l = ['loss money', 'I miss him', 'I not miss him', 'happy new year', 'I am not here I am gone']
for e in l:
    f(e)
# sad / sad / not sad / happy / sad