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

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

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



답변

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

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

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

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


답변

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

예:

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

보고

['segment', 'segment']


답변

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

  • 의 결과 '/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(' ').


답변

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, 항상 대부분의 사람들을 혼란스럽게했습니다 ;-)]], 그러나 명백한 잘 정제 된 수학적 상식에 완전히 부합합니다 !-).


답변

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

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


답변

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

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


답변

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

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

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