2017-06-06 72 views
-1

我试图制作一些lambda表达式。没有任何错误。但它不能正常工作。以下是我的代码。Python中的Lambda表达式无法正常工作

from nltk.tokenize import word_tokenize 

list1 = 'gain, archive, win, success'.split(',') 
list2 = 'miss, loss, gone, give up'.split(',') 

def classify(s, rls): 
for (f, emotion) in rls: 
    if f(s): 
    return emotion 
return "another" 

rules = [(lambda x: (i for i, j in zip(word_tokenize(x),list2) if i == j) != [], "sad"), 
     (lambda x: (a for a, b in zip(word_tokenize(x),list1) if a == b) != [], "happy"),] 

print classify("I win the game", rules) 
print classify("I miss you", rules) 

输出是

sad 
sad 

我不知道什么是错我的代码。有人能帮我吗 !

+3

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误,以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。见[mcve]。 –

+0

我们还需要'word_tokenize'函数定义 –

+0

首先,更正你的代码缩进! –

回答

2

Zip通过列表“并行”迭代,因此它返回一个元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素。返回的列表的长度被截断为最短参数序列的长度。 (source

所以你试图检查句子的第i个单词是否与第i个情感词至少匹配,我猜这不是你想要的。另外,如@ juanpa.arrivillaga所述,您正在检查生成器是否等于空的列表,总是True,原因很简单,生成器不是一个独立于其内容的列表。
你想要的是检查句子中的任何单词是否在情绪列表中。

尝试改变:

lambda x: (i for i, j in zip(word_tokenize(x),list2) if i == j) != [] 

到:

lambda x: any(word in list2 for word in word_tokenize(x)) 

所以,总体来说,你像这样定义规则:

rules = [(lambda x: any(word in list2 for word in word_tokenize(x)), "sad"), 
     (lambda x: any(word in list1 for word in word_tokenize(x)), "happy")] 

另外,还有一些在情绪表中的单词空格这可能会导致比较失败。

list1 = 'gain,archive,win,success'.split(',') 
list2 = 'miss,loss,gone,give up'.split(',') 

甚至更​​好使用strip处理字符串时,删除开头和单词作为一般的好做法的最终空白空间:如下 重新定义它们。

+1

他们当前正在检查是否某个生成器不等于空列表,它总是'真' –

+0

是的,我想检查句子中的任何单词是否在情绪列表中。我尝试了你的方式。但是然后输出是另一个,另一个 –

+0

是的,我做到了。现在输出很开心,很开心。 –