@rsytrade

Как сократить/заменить списковое включение Python?

У меня в процессе "очистки" текста (txt = str(...)), получилось очень длинное списковое включение (недостаток опыта), можно ли его, как-то сократить/оптимизировать (может какие-то альтернативные функции или варианты записи есть)
' '.join([i for i in txt.split() if i.isupper() or i.isdigit() or [x.isdigit() for x in i].count(True) > 0 or [x.isupper() for x in i].count(True) >= 2 or translator.detect(i).lang == 'en' and stemmer.stem(i.lower()) not in trash_words])
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Нечитабельно и сложно поддерживать - ты завтра уже забудешь что тут написано
К тому же у тебя уже логические ошибки - неправильная группировка условия or / and - ты забыл поставить скобки

Твой вариант
txt = 'sdf s7878 adsf '
trash_words = ['s7878']
s = ' '.join([i for i in txt.split() if i.isupper() or i.isdigit() or [x.isdigit() for x in i].count(True) > 0 or [x.isupper() for x in i].count(True) >= 2 and i.lower() not in trash_words])
print(s)

выдает
s7878
а должен ничего не выдавать

Правильно должно быть так
s = ' '.join([i for i in txt.split() if (i.isupper() or i.isdigit() or [x.isdigit() for x in i].count(True) > 0 or [x.isupper() for x in i].count(True) >= 2) and i.lower() not in trash_words])


Я бы сделал вот так
def check_str(i):
    if ((i.isupper() or
        i.isdigit() or
        [x.isdigit() for x in i].count(True) > 0 or
        [x.isupper() for x in i].count(True) >= 2) and
        i.lower() not in trash_words):
        return True
    return False

txt = 'sdf s7878 adsf '
trash_words = []
print(' '.join([i for i in txt.split() if check_str(i)]))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы