Разделить запятыми и убрать пробелы в Python - PullRequest
288 голосов
/ 01 ноября 2010

У меня есть некоторый код Python, который разделяется запятой, но не удаляет пробелы:

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

Я бы предпочел в конечном итоге удалить пробелы, как это:

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

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

Ответы [ 11 ]

499 голосов
/ 01 ноября 2010

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

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

См .: Документы Python по списку
Хорошее 2-секундное объяснение понимания списка.

21 голосов
/ 06 октября 2012

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

>>> 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']

Видите лидирующие пробелы в бла?1015 *

14 голосов
/ 28 февраля 2013

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

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

, но увидел, что это уже упоминалось Джейсоном Орендорффом в комментарии .

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

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

[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(',')) победителем, хотя кажется, что все они находятся в одном поле.

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

Редактировать:

Python 2.6.5 в Ubuntu 10.04

11 голосов
/ 01 февраля 2012

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

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

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

11 голосов
/ 01 ноября 2010

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

mylist = my_string.replace(' ','').split(',')
2 голосов
/ 02 июня 2015
import re
result=[x for x in re.split(',| ',your_string) if x!='']

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

2 голосов
/ 16 марта 2015

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

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

Это не очень хорошо работает для вашего примера строки, но хорошо работает для списка, разделенного запятыми. В качестве примера строки вы можете объединить силу re.split для разделения на шаблонов регулярных выражений , чтобы получить эффект «разбить на это или то».

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

К сожалению, это безобразно, но filter справится с задачей:

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

Voila!

2 голосов
/ 31 января 2015
s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st
1 голос
/ 26 апреля 2017
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

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

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

1 голос
/ 01 ноября 2010

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

...