programing

Python에서 빈 문자열을 분할할 때 split()는 빈 목록을 반환하는 반면 split('\n')는 ['?'를 반환하는 이유는 무엇입니까?

starjava 2023. 6. 21. 22:01
반응형

Python에서 빈 문자열을 분할할 때 split()는 빈 목록을 반환하는 반면 split('\n')는 ['?'를 반환하는 이유는 무엇입니까?

는 사용중을 하고 있습니다.split('\n'), 한 줄 줄 을 긋 고 발 그 견 습 했 니 다 을 것 로 발 니 습 ▁to 다 했 견 ▁that ▁get그 ▁in 을 것''.split()목록인 빈목을반환다니를 합니다.[],하는 동안에''.split('\n')아온다를 합니다.['']그렇게 차이가 나는 구체적인 이유가 있습니까?

그리고 줄에 줄을 세는 더 편리한 방법이 있나요?

例문:.사중용합니다.split('\n'), 한 줄 줄 을 긋 고 발 그 견 습 했 니 다 을 것 로 발 니 습 ▁to 다 했 견 ▁that ▁get그 ▁in 을 것''.split()목록인 빈목을반환다니를 합니다.[],하는 동안에''.split('\n')아온다를 합니다.[''].

이 방법에는 두 가지 알고리즘이 있습니다.인수가 지정되지 않으면 공백이 반복적으로 실행될 때 분할됩니다.그러나 인수가 지정되면 반복 실행이 없는 단일 구분 기호로 간주됩니다.

빈 문자열을 분할하는 경우 첫 번째 모드(인수 없음)는 빈 목록을 반환합니다. 빈 공백이 사용되고 결과 목록에 넣을 값이 없기 때문입니다.

대조적으로, 두 번째 모드(다음과 같은 인수 포함)\n이 첫 빈 필드를 는 첫 번째 빈 필드를 생성합니다.당신이 글을 썼는지 생각해 보세요.'\n'.split('\n')두 개의 필드(한 개의 분할, 두 개의 절반 제공)를 얻을 수 있습니다.

질문:.그렇게 차이가 나는 구체적인 이유가 있습니까?

이 첫 번째 모드는 데이터가 다양한 빈 공간의 양으로 열에 정렬되어 있을 때 유용합니다.예:

>>> data = '''\
Shasta      California     14,200
McKinley    Alaska         20,300
Fuji        Japan          12,400
'''
>>> for line in data.splitlines():
        print(line.split())

['Shasta', 'California', '14,200']
['McKinley', 'Alaska', '20,300']
['Fuji', 'Japan', '12,400']

두 번째 모드는 반복되는 쉼표가 빈 필드를 나타내는 CSV와 같은 구분된 데이터에 유용합니다.예:

>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
Tim,,,USA
'''
>>> for line in data.splitlines():
        print(line.split(','))

['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['Tim', '', '', 'USA']

결과 필드 수가 구분 기호 수보다 1 많습니다.밧줄을 자르는 것을 생각해 보세요.만약 당신이 컷을 하지 않는다면, 한 조각입니다.한 컷을 만들면 두 컷이 나옵니다.두 컷을 만들면 세 컷이 나옵니다.Python ▁is▁다▁it니▁so▁python입도 마찬가지입니다.str.split(delimiter)방법:

>>> ''.split(',')       # No cuts
['']
>>> ','.split(',')      # One cut
['', '']
>>> ',,'.split(',')     # Two cuts
['', '', '']

질문:.그리고 줄에 줄을 세는 더 편리한 방법이 있나요?

네, 쉬운 방법이 몇 가지 있습니다.하나는 사용하고 다른 하나는 사용합니다. 마지막 줄을 놓치지 않는 한 양쪽 모두 동일한 대답을 제공할 것입니다.\n이 빠진 최종새줄누경우된락이▁is,경line▁if우▁the,,str.splitlines접근법은 정확한 답을 줄 것입니다.또한 정확한 더 빠른 기술은 카운트 방법을 사용하지만 최종 새 라인에 대해 수정합니다.

>>> data = '''\
Line 1
Line 2
Line 3
Line 4'''

>>> data.count('\n')                               # Inaccurate
3
>>> len(data.splitlines())                         # Accurate, but slow
4
>>> data.count('\n') + (not data.endswith('\n'))   # Accurate and fast
4    

@Kaz의 질문:왜 아주 다른 두 알고리즘이 하나의 기능으로 통합되는 거지?

.str.split약 20년 전의 것이며, 그 시대의 많은 API들은 엄격하게 실용적입니다.완벽하지는 않지만 메소드 서명도 "끔찍한" 것은 아닙니다.대부분의 경우 Guido의 API 설계 선택은 시간의 시련을 견뎌냈습니다.

현재 API에도 장점이 없는 것은 아닙니다.다음과 같은 문자열을 고려합니다.

ps_aux_header  = 'USER               PID  %CPU %MEM      VSZ'
patient_header = 'name,age,height,weight'

이 문자열들을 필드로 나누라고 요청받았을 때, 사람들은 같은 영어 단어 "split"을 사용하여 둘 다를 설명하는 경향이 있습니다.다음과 같은 코드를 읽도록 요청받았을 때fields = line.split()또는fields = line.split(',')사람들은 문장을 "필드에 줄 바꿈"으로 올바르게 해석하는 경향이 있습니다.

Microsoft Excel의 텍스트 도구는 유사한 API 선택을 했으며 동일한 도구에 두 가지 분할 알고리즘을 통합했습니다.사람들은 하나 이상의 알고리즘이 관련되어 있음에도 불구하고 필드 분할을 단일 개념으로 정신적으로 모델링하는 것처럼 보입니다.

설명서에 따르면, 이는 단순히 작동 방식인 것으로 보입니다.

빈하면 " " " " " " " " " " " " " " " " " " " " " " " " 을 반환합니다.[''].

sep이 지정되지 않았거나 None인 경우 다른 분할 알고리즘이 적용됩니다. 연속 공백의 실행은 단일 구분 기호로 간주되며, 문자열에 선행 또는 후행 공백이 있는 경우 시작 또는 끝에 빈 문자열이 포함되지 않습니다.결과적으로 빈 문자열 또는 공백으로만 구성된 문자열을 없음 구분 기호로 분할하면 []가 반환됩니다.

더 명확하게 서래그, 명게하위기해하확더,▁so▁the더위해기.split()함수는 두 개의 서로 다른 분할 알고리즘을 구현하며, 변수의 존재를 사용하여 실행할 알고리즘을 결정합니다.이것은 아마도 그것이 논쟁이 있는 것보다 논쟁이 없는 것을 최적화할 수 있기 때문일 것입니다; 저는 모릅니다.

.split()매개 변수가 없으면 영리해지려고 합니다.공백, 탭, 공백, 줄 피드 등에서 분할되고 빈 문자열도 모두 건너뜁니다.

>>> "  fii    fbar \n bopp ".split()
['fii', 'fbar', 'bopp']

기적으로본,.split()데 경우와 됩니다..split()문자열을 가져와서 분할하는 매개 변수를 사용합니다.

그것이 차이의 이유입니다.

그리고 네, 분할을 통해 선을 세는 것은 효율적인 방법이 아닙니다.줄 피드 수를 세고 문자열이 줄 피드로 끝나지 않으면 하나를 추가합니다.

이러한 기본 반환 동작을 실제로 피하고 싶은 사용자의 경우['']을 부를 때.split빈 문자열에는 두 가지 가능한 한 줄 솔루션이 있습니다.

list_ = s.split(*list(sep if s.count(sep) else []))
# Or this
list_ = s.split(sep) if s != "" else []

그리고 다음은 실제 예제에서 첫 번째를 사용하는 방법입니다.

import os

sep = os.linesep  # Split char

s_empty = ""
empty = s_empty.split(*list(sep if s_empty.count(sep) else []))

s_nonempty = f"a{sep}b"
nonempty = s_nonempty.split(*list(sep if s_nonempty.count(sep) else []))

print(f"Empty string: {empty}, non-empty string: {nonempty}")

사용하다count():

s = "Line 1\nLine2\nLine3"
n_lines = s.count('\n') + 1
>>> print str.split.__doc__
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string.  If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are removed
from the result.

마지막 문장을 메모합니다.

라인을 카운트하려면 간단히 몇 개의 라인을 카운트할 수 있습니다.\n다음이 있습니다.

line_count = some_string.count('\n') + some_string[-1] != '\n'

은 마막부다음로끝으나않지줄고다로 않는 합니다.\n비록 이것이 의미하는 것이지만Hello, World!그리고.Hello, World!\n동일한 라인 수를 가지십시오(나에게는 합리적입니다). 그렇지 않으면 간단히 추가할 수 있습니다.1의수의 \n.

선을 카운트하려면 선 절단 횟수를 카운트할 수 있습니다.

n_lines = sum(1 for s in the_string if s == "\n") + 1 # add 1 for last line

편집:

기본 제공되는 다른 답변count 더합니다, 실제로는 적해요합사게▁is.

언급URL : https://stackoverflow.com/questions/16645083/when-splitting-an-empty-string-in-python-why-does-split-return-an-empty-list

반응형