Позволяет ли составление списков использовать несколько операторов elif? - PullRequest
1 голос
/ 03 июля 2019
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 ]

2 голосов
/ 03 июля 2019

Конечно, вот шипение, использующее понимание списка.Это ужасно читать, и любой, кто читает это, будет ненавидеть тебя.Для сложных вещей 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)]
0 голосов
/ 03 июля 2019

На мой взгляд, лучшим ответом здесь будет @ dfundako's, потому что, когда речь идет о сложных вещах 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 в списке.

Надеюсь, это поможет!

...