[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를 설계하도록 스스로를 가르 칠 수있는 가장 간단하고 일반적인 방법입니다. 다른 예를 들자면하기 위해 매우 중요합니다 그 유효한을위한 x
과 y
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
구분 기호 앞뒤에 무엇을 제공해야 '/'
하지만 다른 문자는 없습니다. 그것은 그래서 이 당신에게 기술적으로 선행하고 다음에 빈 문자열주고 '/'
있기를 '' + '/' + '' == '/'
.