列表理解是否允许多个elif语句?

时间:2019-07-03 16:46:31

标签: python python-3.x list-comprehension

noun_gathering_system = [(lemmatizer.lemmatize(word), 1) if tag.pos_tag([word])[0][1] in ["NN", "NNS", "NNP", "NNPS", "FW"] else (lemmatizer.lemmatize(word), 2) if tag.pos_tag([word])[0][1] in ["PRP"] else (lemmatizer.lemmatize(word), 3) if tag.pos_tag([word])[0][1] in ["JJ"] else continue for word in word_tokenize(sentence.lower())]

我使用nltk,试图从句子中仅收集某些名词和单词。我想优先考虑名词1,代词2,形容词3收集的单词。在没有列表理解的情况下编写时,代码可以正常工作,但在具有列表理解的情况下,我的代码始终失败,并出现以下错误。

  File "main.py", line 16
    validitychecker = [(lemmatizer.lemmatize(word), 1) if tag.pos_tag([word])[0][1] in ["NN", "NNS", "NNP", "NNPS", "FW"] else (lemmatizer.lemmatize(word), 2) if tag.pos_tag([word])[0][1] in ["PRP"] else (lemmatizer.lemmatize(word), 3) if tag.pos_tag([word])[0][1] in ["JJ"] else pass for word in word_tokenize(sentence.lower())]
                                            ^
SyntaxError: invalid syntax

我不确定为什么语法错误,并且任何帮助都很好。

2 个答案:

答案 0 :(得分:2)

当然,这是使用列表推导的Fizzbuzz。阅读太糟糕了,任何阅读它的人都会讨厌你。对于复杂的if / else东西,请编写一个标准循环。

['Fizzbuzz' if x%3==0 and x%5==0 else 'Fizz' if x%3==0 else 'Buzz' if x%5==0 else x for x in range(1,101)]

答案 1 :(得分:0)

在我看来,最好的答案是@dfundako,因为涉及复杂的if / else东西时,编写一个标准循环要容易得多。但是,如果您真的想将其保留为列表理解,则您唯一的错误是pass语句,可以将其替换为None,如下所示:

validitychecker = [(lemmatizer.lemmatize(word), 1) if tag.pos_tag([word])[0][1] in ["NN", "NNS", "NNP", "NNPS", "FW"] else (lemmatizer.lemmatize(word), 2) if tag.pos_tag([word])[0][1] in ["PRP"] else (lemmatizer.lemmatize(word), 3) if tag.pos_tag([word])[0][1] in ["JJ"] else None for word in word_tokenize(sentence.lower())]

然后,您只需执行list(filter(None, validitychecker))即可删除列表中的所有None

希望这会有所帮助!