Python中的Lambda表达式无法正常工作

时间:2017-06-06 08:44:07

标签: python lambda

我尝试制作一些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

我不知道我的代码有什么问题。有人可以帮助我!

1 个答案:

答案 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从单词的开头和结尾删除空格,作为处理字符串时的一般好习惯。