Разделение строки и удаление пробелов Python

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

Например, если у меня есть строка:

"QVOD, Baidu Player"

Я хотел бы разделить и разделить на:

['QVOD', 'Baidu Player']

Есть ли элегантный способ сделать это? Возможно, используя понимание списка?


person Daniel Pilch    schedule 21.01.2014    source источник
comment
Всегда ли формат данных будет одинаковым?   -  person thefourtheye    schedule 21.01.2014
comment
Возможный дубликат этого вопроса. Не полностью, но вы можете найти там все ответы, которые вам нужны.   -  person Kraay89    schedule 21.01.2014
comment
@ Kraay89 Это не дубликат вопроса, на который вы ссылаетесь.   -  person Toby Allen    schedule 20.02.2014


Ответы (2)


В Python есть замечательная функция split, которая избавит вас от необходимости использовать регулярное выражение или что-то подобное. Вы можете разделить строку, просто позвонив my_string.split(delimiter)

После этого в python есть функция strip, которая удаляет все пробелы в начале и в конце строки.

[item.strip() for item in my_string.split(',')]

Контрольные показатели для двух методов приведены ниже:

>>> import timeit
>>> timeit.timeit('map(str.strip, "QVOD, Baidu Player".split(","))', number=100000)
0.3525350093841553
>>> timeit.timeit('map(stripper, "QVOD, Baidu Player".split(","))','stripper=str.strip', number=100000)
0.31575989723205566
>>> timeit.timeit("[item.strip() for item in 'QVOD, Baidu Player'.split(',')]", number=100000)
0.246596097946167

Таким образом, составление списка примерно на 33% быстрее, чем карта.

Вероятно, также стоит отметить, что, поскольку он «питонический», сам Гвидо голосует за LC. http://www.artima.com/weblogs/viewpost.jsp?thread=98196

person Slater Victoroff    schedule 21.01.2014
comment
@DSM Ой, я плохо. Спасибо, что уловили это. - person Slater Victoroff; 21.01.2014
comment
Спасибо. Я уже пробовал что-то подобное, и каждая часть QVOD и т. Д. Помещается в новую строку. Ответ ниже работает хорошо, так как все находится в списке. - person Daniel Pilch; 21.01.2014
comment
@DanielPilch: оба метода создают один и тот же список. - person DSM; 21.01.2014
comment
@SlaterTyranus Пожалуйста, проверьте обновленный код. Это может работать почти так же быстро, как LC. - person thefourtheye; 21.01.2014
comment
@thefourtheye Он быстрее, чем другая версия, но все же заметно медленнее, чем LC - person Slater Victoroff; 21.01.2014
comment
@SlaterTyranus Обратите внимание, что это зависит от машины. Проверяю результаты на моей машине :) - person thefourtheye; 21.01.2014
comment
Да, вы правы, я печатал элемент, а не создавал список из categories = [item.strip() for item in my_string.split(',')] глупой ошибки понимания, и да, это быстрее, спасибо! - person Daniel Pilch; 21.01.2014
comment
@StevenRumbalski Аргументы между LC и функциями map, reduce, filter довольно хорошо известны, поэтому я решил, что это не требует особого обсуждения, но связано со статьей, чтобы попытаться охватить этот аспект. - person Slater Victoroff; 21.01.2014

Немного функционального подхода. split, разбивает строку на основе ,, и каждый элемент будет удален на str.strip, на map.

>>> stripper = str.strip
>>> map(stripper, "QVOD, Baidu Player".split(","))
['QVOD', 'Baidu Player']

Небольшое сравнение времени

import timeit
stripper = str.strip
print timeit.timeit('map(stripper, "QVOD, Baidu Player".split(","))', "from __main__ import stripper", number=100000)
print timeit.timeit("[item.strip() for item in 'QVOD, Baidu Player'.split(',')]", number=100000)

Вывод на моем компьютере

0.553178071976
0.569463968277

Таким образом, и метод понимания списка, и метод map работают почти одинаково.

person thefourtheye    schedule 21.01.2014
comment
Почему вы присваиваете str.strip переменной? Почему бы не передать его напрямую -map(str.strip, "QVOD, Baidu Player".split(",")) - person pyrospade; 21.01.2014
comment
@pyrospade Необязательно получать от str каждый раз. Итак, небольшой прирост производительности :) - person thefourtheye; 21.01.2014
comment
@thefourtheye Правда? Я бы предположил, что когда вы передаете str.strip в map(function, sequence), он назначается параметру function и используется там локально как переменная. - person pyrospade; 21.01.2014
comment
@thefourtheye Какую версию Python вы используете? - person Slater Victoroff; 21.01.2014