Удалить завершающую новую строку из элементов списка строк


123

Мне нужно взять большой список слов в форме:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

а затем, используя функцию полосы, превратите ее в:

['this', 'is', 'a', 'list', 'of', 'words']

Я думал, что то, что я написал, сработает, но продолжаю получать сообщение об ошибке:

"объект" список "не имеет атрибута" полоса ""

Вот код, который я пробовал:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

1
Пожалуйста, объясните, почему вы добавляете от 0 до strip_list19 раз, а затем добавляете зачеркнутые строки. От этого кода очень плохо пахнет. Кроме того, если вы получили этот материал из файла, вы должны удалить его по пути - создание большого списка, а затем вставка его в другой большой список - не лучшая идея. Также 2, ваш код не должен зависеть от знания длины самого длинного слова / строки. Сделайте шаг назад - чего вы пытаетесь достичь? Что ты будешь делать strip_list?
Джон Мачин

Ответы:


212
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']

Могу я просто сказать stripped_list = map (str.strip, my_list), а затем напечатать stripped_list, чтобы распечатать этот новый список?
Джордж Берроуз

19
Если вы используете Python 2, обратите внимание, что это str.stripработает , только если вы уверены, что список не содержит строк Unicode. Если он может содержать как 8-битные строки, lambda s: s.strip()так и строки Юникода, используйте, как указано выше, или используйте stripфункцию, которую вы можете импортировать из stringsмодуля.
Cito

Комментарий Cito на самом деле заслуживает самой высокой репутации. Списки отображения и понимания не эквивалентны в ООП, потому что мы устаревшие методы, а не функции.
e-satis

встроенная функция карты в
самаритянине

39
Имейте в виду следующее: если вы используете Python 3.x и хотите вернуть список, вы должны это сделать list, чтобы он list(map(str.strip, my_list)). Также проверьте это: ссылка .
So S


65

Вы можете использовать списки понимания :

strip_list = [item.strip() for item in lines]

Или mapфункция:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)

3
Лямбда во второй версии перебор.
gddc 02

1
Вы можете использовать тот же подход, чтобы делать то же самое со 0значениями в начале списка. Хотя я действительно не могу представить, чего вы пытаетесь достичь, помещая их в тот же список результатов ...
Карл Кнехтель

4
В Python 3 третья форма «без лямбда» должна быть strip_list = list(map(str.strip, lines))такой, как map () возвращает итератор карты. docs.python.org/3/library/functions.html#map
Деви,

7

Это можно сделать с помощью списков, как определено в PEP 202.

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]

Я думал сменить имя с listна map:)
Кейси

3

Все остальные ответы, и в основном о понимании списка, великолепны. Но просто чтобы объяснить вашу ошибку:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

aявляется членом вашего списка, а не индексом. Вы могли бы написать вот что:

[...]
for a in lines:
    strip_list.append(a.strip())

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

strip_list = [0] * 20

Но это не так полезно, как .append добавляет то в ваш список. В вашем случае бесполезно создавать список со значениями по умолчанию, так как вы будете создавать его элемент для каждого элемента при добавлении разделенных строк.

Итак, ваш код должен быть таким:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

Но, безусловно, лучший - это этот, потому что это одно и то же:

stripped = [line.strip() for line in lines]

Если у вас есть что-то более сложное, чем просто a .strip, поместите это в функцию и сделайте то же самое. Это наиболее удобный способ работы со списками.


2

Если вам нужно удалить только завершающие пробелы, вы можете использовать str.rstrip(), что должно быть немного более эффективным, чем str.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.