2017-06-07 99 views
-2

我有一個簡單的python程序。查找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__' 

我需要什麼在這裏,我要檢查,如果在句子中的任何詞是在列表2。如果是,那麼要檢查其索引值是否在否定列表中。如果是的話,應該是「不難過」。

舉個例子「我想他」應該傷心,「我不想他」應該不難過。

任何人都可以幫助我!

回答

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良好的話。 我考慮了另外兩個案例。如果沒有單詞屬於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 
+0

注,當比賽進行到list2中被發現,只是一個否定在場,你是不是在找前一個字。 「我不在這裏我走了」會用你的代碼返回''不難過',當描述的算法會返回''悲傷'' – Baldrickk

+0

@Baldrickk感謝您的評論,我沒有注意到!我更新瞭解決這個問題:) – Nuageux

+0

不錯,這正是我的預期。謝謝。 –

3

你有一些問題在這裏,對於初學者:

  • 如果你將要翻翻套的話,使用集合,而不是名單。例如negations={'no','not','never'}
  • 'give up'永遠不會在句子中作爲標記找到。
  • any()返回布爾值(請參閱this question)瞭解它的工作原理。
  • listobj[-1:]返回列表的切片,只有最後一個元素
  • 你是不是試圖從列表或容器項目,爲any()返回一個布爾值,你正試圖把一個布爾值作爲容器。這是什麼導致你可以看到的錯誤。

我建議你將問題分解爲更合理的步驟,而不是直接跳入列表解析/生成器。
如果您想根據其他人的位置來訪問列表中的項目,我建議首先是一個編入索引的循環:像字斷詞

for index, value in enumerate(var): 
    last_word=var[index-1] if index > 0 else None 

,做業務只有一次,沒有必要繼續做下去了並結束。

例解:

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 
>>> 
+0

非常好的解釋。通過你的回答,我糾正了很多錯誤 –

相關問題