split () 결과에 빈 문자열이 반환되는 이유는 무엇입니까?


120

'/segment/segment/'.split('/')돌아 오는 이유는 무엇입니까 ['', 'segment', 'segment', '']?

빈 요소를 확인하십시오. 위치 1과 문자열의 맨 끝에있는 구분 기호를 분할하는 경우 각 끝에서 빈 문자열을 반환하도록하는 추가 값은 무엇입니까?


1
나는 같은 질문을 가지고 오랫동안 그것을 검색했습니다. 이제 빈 결과가 정말 중요하다는 것을 이해합니다. 질문 해 주셔서 감사합니다.
emeraldhieu

2
해결책은 strip()분할하기 전에 문자열에서 선행 및 후행 분할 문자를 제거하는 데 사용하는 것입니다 .'/segment/segment/'.strip('/').split('/')
pkamb

답변:


178

str.split보완 str.join, 그래서

"/".join(['', 'segment', 'segment', ''])

원래 문자열로 되돌립니다.

빈 문자열이 아니었다면, 처음과 마지막은 '/'애프터 누락 될 것이다join()


11
간단하지만 질문에 완전히 답합니다.
orokusaki

곱슬 따옴표가 실제로 파이썬에서 유효하다는 사실에 충격을 받았습니다 ...하지만 ... 어떻게? 문서 는 이것을 언급하지 않는 것 같습니다.
Tim Pietzcker 2012 년

@ 팀, 나는 없다 아무 생각 / : 그 따옴표가 거기에 도착하는 방법
존 라 Rooy

7
그렇다면 Microsoft Word를 Python IDE로 사용하지 않습니까? :)
Tim Pietzcker 2012 년

1
@ aaa90210 누가 간단한 대답이 최고가 아니라고 했습니까? 답이 간단하지만 질문에 완전히 답한 것에 대한 댓글 (첫 번째, 5 년 전)이었습니다. 문장에서 "but"를 사용하는 것은 나쁜 것을 의미하지 않습니다. 단순하지 않은 답변이 더 완전한 답변 일 수 있습니다 (예 : 관련 결정 또는 언급 된 기능과 관련된 PEP 포함).
orokusaki

88

보다 일반적으로 split()결과에 반환 된 빈 문자열을 제거 하려면 filter함수 를 살펴볼 수 있습니다.

예:

filter(None, '/segment/segment/'.split('/'))

보고

['segment', 'segment']

3
감사합니다.이 답변이 왜 그렇게 깊지 않고 다른 모든 것이 초보적인 것인지 모르겠습니다.
Wedge

6
필터 객체를 출력으로 가져 오는 대신 결과를 목록으로 수집하려면 전체 필터 구조를 list(...).
Tim Visée 2017

29

여기에서 고려해야 할 두 가지 주요 사항이 있습니다.

  • 의 결과 '/segment/segment/'.split('/')가 같을 것으로 예상하는 ['segment', 'segment']것은 합리적이지만 정보가 손실됩니다. split()당신이 원하는 방식으로 일 했다면 , 내가 당신에게 그렇게 말하면 a.split('/') == ['segment', 'segment'], 당신은 무엇인지 말할 수 없습니다 a.
  • 결과는 무엇입니까 'a//b'.split()? ['a', 'b']?, 또는 ['a', '', 'b']? 즉, split()인접한 구분 기호를 병합 해야 합니까? 필요한 경우 문자로 구분 된 데이터를 구문 분석하기가 매우 어렵고 일부 필드는 비어있을 수 있습니다. 나는 확실히 많은 사람들이 있습니다 꽤 나는 위의 경우에 대한 결과에서 빈 값을 원한다!

결국 두 가지로 요약됩니다.

일관성 : 내가 가지고있는 경우 n에, 구분 기호를 a, 내가 얻을 n+1값은 후 백업 split().

복잡한 작업을 수행하고 간단한 작업을 쉽게 수행 할 수 있어야합니다.의 결과로 빈 문자열을 무시 split()하려면 항상 다음을 수행 할 수 있습니다.

def mysplit(s, delim=None):
    return [x for x in s.split(delim) if x]

그러나 빈 값을 무시하고 싶지 않으면 수 있어야합니다.

언어는 하나의 정의를 선택 split()해야합니다. 기본값으로 모든 사람의 요구 사항을 충족하기에는 너무 많은 사용 사례가 있습니다. 저는 Python의 선택이 좋은 선택이고 가장 논리적이라고 생각합니다. (제외로, 내가 C를 좋아하지 않는 이유 중 하나 strtok()는 인접한 구분 기호를 병합하여 심각한 구문 분석 / 토큰 화를 수행하기가 극히 어렵 기 때문입니다.)

한 가지 예외가 있습니다. a.split()인자가 없으면 연속적인 공백이 꽉 차지 만이 경우에 이것이 옳은 일이라고 주장 할 수 있습니다. 동작을 원하지 않는 경우 언제든지 a.split(' ').


중복 된 공간을 핵폭탄 한 다음 분할하는 것이 더 빠른지, 아니면 비어 있지 않은 문자열 만 분할하여 취하는 것이 더 빠른지 궁금한 사람들을 위해 다음과 같은 결과를 얻을 수 있습니다 python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')".-> 875 nsec per loop; python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"-> 루프 당 616 nsec
s3cur3

8

x.split(y)의 목록을 반환 항상 1 + x.count(y)항목은 귀중한 규칙 - 그것은하게 밖으로 @ gnibbler 이미 지적한 것 같이 split하고 join서로의 정확한 역관계 (그들은 분명히해야한다로), 또한 정확하게 구분에 가입 한 기록의 모든 종류의 의미를 (매핑 같은 csv파일 라인 [[문제를 인용 순]에서 선 /etc/group파일 경로 및 URL)에서 (상대 경로 대 절대 유닉스가, 등)는 로마의 대답은 언급 @로 (수) (예를 들어 쉽게 확인) 기타 등등.

그것을 보는 또 다른 방법은 이득이없이 정보를 창 밖으로 던져서는 안된다는 것입니다. x.split(y)와 동등하게 만들면 무엇을 얻을 수 x.strip(y).split(y)있습니까? 아무것도 물론 - 첫 번째 양식이 임의로 두 번째를 의미하는 것으로 간주 된 경우이 때의 당신이 무슨 뜻인지,하지만, 당신이해야 할 일이 많이 줄 때 두 번째 양식을 사용하기 쉽게하지 않는 첫 번째 원하는 ( 이전 단락에서 지적했듯이 드물지 않습니다.)

그러나 실제로 수학적 규칙 성 측면에서 생각하는 것은 통과 가능한 API를 설계하도록 스스로를 가르 칠 수있는 가장 간단하고 일반적인 방법입니다. 다른 예를 들자면하기 위해 매우 중요합니다 그 유효한을위한 xy x == x[:y] + x[y:]- 슬라이싱의 극단적가 왜 즉시 나타내는 한다 제외. 당신이 공식화 할 수있는 불변 적 주장이 더 간단할수록, 그 결과 의미론은 당신이 실제 생활에서 필요로하는 것일 가능성이 더 높습니다. 수학이 우주를 다루는 데 매우 유용하다는 신비로운 사실의 일부입니다.

split선행 및 후행 구분 기호가 특수한 경우의 방언에 대한 불변을 공식화 해보십시오 . 반대 예 : isspace최대한 간단하지 않은 문자열 메서드 x.isspace()는 다음과 같습니다. x and all(c in string.whitespace for c in x)바보 같은 선행 x and이 코딩을 자주 찾는 이유입니다. not x or x.isspace(), 문자열 메소드 로 설계 되어야 하는 단순함으로 돌아 가기 위해 is...(빈 문자열은 "당신이 원하는 모든 것입니다.-거리의 사람 말과는 달리, 아마도 [[빈 세트, 0과 같은" & c, 항상 대부분의 사람들을 혼란스럽게했습니다 ;-)]], 그러나 명백한 잘 정제 된 수학적 상식에 완전히 부합합니다 !-).


5

어떤 종류의 답변을 찾고 있는지 잘 모르겠습니다. 세 개의 구분자가 있기 때문에 세 개의 일치 항목이 있습니다. 빈 것을 원하지 않으면 다음을 사용하십시오.

'/segment/segment/'.strip('/').split('/')

4
-1 왜냐하면 3 개가 아닌 4 개의 매치를 얻었 기 때문입니다. 그리고 이것은 실제로 질문에 대한 답이 아닙니다.
Roman

1
부정을 막기 위해 +1 .. 그는 당신이 3 개의 결과를 얻을 것이라고 말하지 않았습니다. 그는 "세 개의 구분자"에 대해 "세 개의 일치"라고 말했는데, 이는 나에게 논리적으로 들립니다. 그러나 "4 개의 일치"를 얻지는 못합니다. 하지만 결과에 "4 개의 요소"가 반환됩니다. 또한 "이유"에 대한 직접적인 대답은 아니지만 그가 진정으로 원하는 것을 얻을 수있는 간단한 방법을 제공합니다. 누군가를 뽑을 거라면 (그 이하도 아닌) 더 조심하세요! 건배! 8 ^)
kodybrown 2013 년

@wasatchwizard 설명해 주셔서 감사합니다. 수정과 추천에 감사드립니다. 안타깝게도 이제 내 투표가 잠겨서 변경할 수 없습니다.
Roman

난 당신의 솔루션을 사랑 - 스트립이 다음 빈 결과를 제거하기 위해 분할
남 G VU

5

음, 거기에 구분자가 있다는 것을 알 수 있습니다. 따라서 4 개의 결과를 보면 3 개의 구분 기호가 있음을 알 수 있습니다. 이렇게하면 Python이 빈 요소를 삭제하고 필요한 경우 시작 또는 끝 구분 기호를 수동으로 확인하는 대신이 정보로 원하는 모든 작업을 수행 할 수 있습니다.

간단한 예 : 절대 파일 이름과 상대 파일 이름을 확인하고 싶다고 가정 해 보겠습니다. 이렇게하면 파일 이름의 첫 번째 문자가 무엇인지 확인하지 않고도 분할을 통해 모든 작업을 수행 할 수 있습니다.


1

이 최소한의 예를 고려하십시오.

>>> '/'.split('/')
['', '']

split구분 기호 앞뒤에 무엇을 제공해야 '/'하지만 다른 문자는 없습니다. 그것은 그래서 당신에게 기술적으로 선행하고 다음에 빈 문자열주고 '/'있기를 '' + '/' + '' == '/'.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.