Видаліть нижній рядок із елементів списку рядків


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-бітні, так і Unicode рядки, використовуйте, lambda s: s.strip()як було сказано вище, або використовуйте stripфункцію, яку ви можете імпортувати з stringsмодуля.
Cito

Коментар Cito насправді той, хто заслуговує на найбільшу кількість представників. Карти та списки розуміння не є рівнозначними в OOP, оскільки ми проходимо методи, а не функції.
e-satis

вбудована функція карти у
самаріанці

39
Будьте в курсі наступного: Якщо ви використовуєте Python 3.x і хочете повернути список, ви повинні list, щоб він був list(map(str.strip, my_list)). Також перевірте це: посилання .
Тож 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

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

4
У Python 3 3-я форма "без лямбда" повинна бути strip_list = list(map(str.strip, lines))такою, як map () повертає ітератор карти. docs.python.org/3/library/functions.html#map
Devy

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.