Удалить несколько вхождений, кроме определенных значений?

У меня есть список строк текста: textlines который представляет собой список строк (заканчивается '\n').

Я хотел бы удалить множественные вхождения строк, исключая те, которые содержат только пробелы, переводы строк и табуляции.

Другими словами, если исходный список:

textlines[0] = "First line\n"
textlines[1] = "Second line \n"
textlines[2] = "   \n"
textlines[3] = "First line\n"
textlines[4] = "   \n"

Список вывода будет:

textlines[0] = "First line\n"
textlines[1] = "Second line \n"
textlines[2] = "   \n"
textlines[3] = "   \n"

Как это сделать?

3 ответа

Решение
seen = set()
res = []
for line in textlines:
    if line not in seen:
        res.append(line)
        if not line.strip():
            seen.add(line)
textlines = res

Потому что я не могу устоять перед хорошим кодом игры в гольф:

seen = set()

[x for x in textlines if (x not in seen or not x.strip()) and not seen.add(x)]
Out[29]: ['First line\n', 'Second line \n', '   \n', '   \n']

Это эквивалентно ответу @hughbothwell. Что вы должны использовать, если вы когда-нибудь захотите, чтобы люди читали ваш код:-)

new = []
for line in textlines:
    if line in new and line.strip():
        continue
    new.append(line)
textlines = new
Другие вопросы по тегам