[python] 파이썬에서 쉼표로 나누고 공백을 제거하십시오.

쉼표로 분할되지만 공백을 제거하지 않는 파이썬 코드가 있습니다.

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

오히려 다음과 같이 공백이 제거됩니다.

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

나는 목록을 반복하고 각 항목을 strip () 할 수 있다는 것을 알고 있지만 이것이 파이썬이기 때문에 더 빠르고 쉽고 우아한 방법이 있다고 생각합니다.



답변

리스트 이해를 사용하십시오- for루프 처럼 간단하고 읽기 쉽습니다 .

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

참조 : 리스트 이해에 관한 파이썬 문서리스트 이해에
대한 2 초간 설명.


답변

정규식을 사용하여 분할하십시오. 참고 나는 공백을 사용하여 사례를보다 일반적으로 만들었습니다. 목록 이해는 앞면과 뒷면의 null 문자열을 제거하는 것입니다.

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

blah의 앞 공간을 보십니까?

설명 : 위의 Python 3 인터프리터를 사용하지만 결과는 Python 2에서 동일합니다.


답변

나는 추가했다 :

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

하지만 이미 제이슨 Orendorff 언급했다 보았다 코멘트 .

동일한 답변에서 글렌 메이 너드의 의견을 읽고지도를 통해 목록 이해를 제안하는 이유는 무엇인지 궁금해하기 시작했습니다. 나는 그가 성능상의 이유를 의미한다고 생각했지만, 물론 그는 스타일적인 이유나 다른 것 (Glenn?)을 의미했을 수도 있습니다.

그래서 루프에서 세 가지 방법을 적용하여 상자에 대한 빠른 (아마도 결함이 있습니까?) 테스트가 나타났습니다.

[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(','))그들이 같은 야구장에있는 것처럼 보이지만 우승자를 만드는 것.

확실히 (맵이 있거나없는) 맵이 반드시 성능상의 이유로 배제되어서는 안되며, 적어도 목록 이해만큼 명확합니다.

편집하다:

우분투 10.04의 Python 2.6.5


답변

분리하기 전에 문자열에서 공백을 제거하십시오.

mylist = my_string.replace(' ','').split(',')


답변

나는 이것이 이미 대답되었다는 것을 알고 있지만, 이것을 많이 끝내면 정규 표현식이 더 나은 방법 일 수 있습니다.

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

\s공백 문자와 일치, 우리는 빈 문자열로 대체합니다 ''. 자세한 정보는 여기에서 찾을 수 있습니다 : http://docs.python.org/library/re.html#re.sub


답변

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.split 전원을 결합하여 정규식 패턴 을 분할하여 “이것 또는 그에 대한 분할”효과를 얻을 수 있습니다.

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

불행히도, 그것은 추악하지만, filter의지는 트릭을 수행합니다.

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

짜잔!