Замена специальных символов в списке в Python - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь избавиться от специальных символов в списке:

file_stuff
['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']

file_stuff_new = [x for x in file_stuff if x != '\n']
file_stuff_new = [x.replace('\n', '') for x in file_stuff_new]
file_stuff_new

['John Smith', 'Gardener', 'Age 27', 'Englishman']

Это, очевидно, работает.Любые другие предложения?

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Этот пример - простое понимание списка с условием:

>>> stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> pure = [i.strip() for i in stuff if i.strip()]
>>> print(pure)
['John Smith', 'Gardener', 'Age 27', 'Englishman']
0 голосов
/ 08 июня 2018

Вы можете попробовать сопоставить свой список с функцией, такой как replace:

file_stuff = map(lambda x: x.replace("\n", ""), file_stuff)
0 голосов
/ 08 июня 2018

Вы используете необработанный строковый литерал.

r'\n' - это не символ новой строки, это строка длины два, содержащая символы "\" и "n".

>>> r'\n'
'\\n'
>>> len(r'\n')
2

В противном случае ваш оригинальный подход работает (почти) нормально.

>>> file_stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> [x.replace('\n', '') for x in file_stuff]
['John Smith', '', 'Gardener', '', 'Age 27', '', 'Englishman']

Мы можем отфильтровать пустые строки следующим образом:

>>> file_stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> no_newline = (x.replace('\n', '') for x in file_stuff)
>>> result = [x for x in no_newline if x]
>>> result
['John Smith', 'Gardener', 'Age 27', 'Englishman']

, где no_newline - генератор с эффективным использованием памятиэто не создает промежуточный временный список.

Если вы просто хотите удалить пробелы и символы новой строки из начала и конца строк, рассмотрите метод str.strip.

>>> file_stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> no_newline = (x.strip() for x in file_stuff)
>>> result = [x for x in no_newline if x]
>>> result
['John Smith', 'Gardener', 'Age 27', 'Englishman']

Это может быть сокращено до

>>> result = [x.strip() for x in file_stuff if x.strip()]
>>> result
['John Smith', 'Gardener', 'Age 27', 'Englishman']

, если вы можете справиться с бесполезностью вызова str.strip дважды за строку.

0 голосов
/ 08 июня 2018

вы можете использовать strip (), как:

file_stuff = map(lambda s: s.strip(), file_stuff)
print(file_stuff)
// ['John Smith', '', 'Gardener', '', 'Age 27', '', 'Englishman']

использовать фильтр, если вы хотите удалить пустые элементы из списка, например

file_stuff = filter(None, map(lambda s: s.strip(), file_stuff))
...