반응형
질문
더 간단한 방법이 있어야 할 것 같습니다:
import string
s = "string. With. Punctuation?" # 샘플 문자열
out = s.translate(string.maketrans("",""), string.punctuation)
있을까요?
답변
효율적인 관점에서, 다음을 이길 수는 없습니다.
s.translate(None, string.punctuation)
Python의 더 높은 버전에서는 다음 코드를 사용하십시오:
s.translate(str.maketrans('', '', string.punctuation))
이는 C에서 룩업 테이블을 사용하여 원시 문자열 작업을 수행합니다. 이를 이길 수 있는 것은 C 코드를 직접 작성하는 것뿐입니다.
속도가 걱정되지 않는다면, 다른 옵션은 다음과 같습니다:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
이는 각 문자마다 s.replace보다 빠르지만, 정규식이나 string.translate와 같은 순수 파이썬 접근법만큼 잘 수행되지는 않습니다. 아래의 시간 측정 결과에서 확인할 수 있습니다. 이러한 유형의 문제에서 가능한 한 낮은 수준에서 작업하는 것이 가장 효과적입니다.
시간 측정 코드:
import re, string, timeit
s = "문자열. 구두점이 있습니다."
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))
def test_set(s):
return ''.join(ch for ch in s if ch not in exclude)
def test_re(s): # Vinko의 솔루션을 수정한 것입니다.
return regex.sub('', s)
def test_trans(s):
return s.translate(table, string.punctuation)
def test_repl(s): # S.Lott의 솔루션입니다.
for c in string.punctuation:
s=s.replace(c,"")
return s
print "집합 :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "정규식 :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "번역 :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "교체 :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)
다음은 결과입니다:
집합 : 19.8566138744
정규식 : 6.86155414581
번역 : 2.12455511093
교체 : 28.4436721802
반응형
댓글