Разделить запятыми и разделять пробелами в Python



у меня есть код python, который разбивается на запятую, но не удаляет пробелы:



>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots ', ' of ', ' spaces', ' here ']


Я бы предпочел в конечном итоге с пробелами удалены следующим образом:



['blah', 'lots', 'of', 'spaces', 'here']


Я знаю, что я мог бы перебирать список и разделять() каждый элемент, но, поскольку это Python, я предполагаю, что есть более быстрый, простой и элегантный способ сделать это.

935   11  

11 ответов:

использовать список понимание -- проще, и так же легко читать как for петли.

my_string = "blah, lots  ,  of ,  spaces, here "
[x.strip() for x in my_string.split(',')]

посмотреть:Python docs on List Comprehension
хорошее 2-секундное объяснение понимания списка.

разделить с помощью регулярного выражения. Обратите внимание, что я сделал случай более общим с ведущими пробелами. Понимание списка состоит в том, чтобы удалить пустые строки спереди и сзади.

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

это работает, даже если ^\s+ не соответствует:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

вот почему вам нужно ^\s+:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

смотрите ведущие пробелы в бла?

уточнение: выше используется интерпретатор Python 3, но результаты одинаковы в Python 2.

Я знаю, что на это уже ответили, но если вы закончите делать это много, регулярные выражения могут быть лучшим способом пойти:

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

The \s соответствует любому символу пробела, и мы просто заменяем его пустой строкой ''. Вы можете найти дополнительную информацию здесь:http://docs.python.org/library/re.html#re.sub

Я пришел добавить:

map(str.strip, string.split(','))

но видел, как это уже было упомянуто Джейсон Orendorff в комментарий.

читая комментарий Гленна Мейнарда в том же ответе, предлагающем понимание списка по карте, я начал задаваться вопросом, почему. Я предположил, что он имел в виду из соображений производительности, но, конечно, он мог иметь в виду стилистические причины или что-то еще (Гленн?).

так быстро (возможно, ущербные?) тест на моей коробке применяя три методы в цикле выявлены:

[word.strip() for word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

делая map(str.strip, string.split(',')) победитель, хотя кажется, что все они находятся в одном и том же поле.

конечно, хотя карта (с или без лямбды) не обязательно должна быть исключена из соображений производительности, и для меня это по крайней мере так же ясно, как понимание списка.

Edit:

Python 2.6.5 на Ubuntu 10.04

просто удалить пробелы из строки, прежде чем разделить его.

mylist = my_string.replace(' ','').split(',')
import re
result=[x for x in re.split(',| ',your_string) if x!='']

это прекрасно работает для меня.

re (как в регулярных выражениях) позволяет разделить на несколько символов сразу:

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

Это не очень хорошо работает для вашего примера строки, но прекрасно работает для списка, разделенного запятыми. Для примера строки, вы можете объединить re.разделить мощность, чтобы разделить на регулярные выражения чтобы получить эффект" Сплит-на-том-то".

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

к сожалению, это некрасиво, но filter будет делать трюк:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

вуаля!

map(lambda s: s.strip(), mylist) было бы немного лучше, чем явно цикл. Или за все сразу:map(lambda s:s.strip(), string.split(','))

s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

просто запятая или хотя бы один пробел с/без предшествующих/последующих пробелов.

пожалуйста, попробуйте!

map(lambda s: s.strip(), mylist) было бы немного лучше, чем явно цикл.
Или за все сразу:

map(lambda s:s.strip(), string.split(','))

это в основном все, что вам нужно.

Comments

    Ничего не найдено.