문자열에서 소문자 부분 문자열을 모두 제거하는 Python (일반 또는 numpy 사용)의 효율적인 방법은 무엇입니까 s
?문자열에서 소문자 부분 문자열을 빨리 제거 할 수 있습니까?
s = "FOObarFOOObBAR"
remove_lower(s) => "FOOFOOBAR"
문자열에서 소문자 부분 문자열을 모두 제거하는 Python (일반 또는 numpy 사용)의 효율적인 방법은 무엇입니까 s
?문자열에서 소문자 부분 문자열을 빨리 제거 할 수 있습니까?
s = "FOObarFOOObBAR"
remove_lower(s) => "FOOFOOBAR"
나는 str.translate
을 사용합니다. 변환 테이블에 None
을 전달하면 h 제 단계 만 수행됩니다. 이 경우, 나는 ascii_lowercase
을 삭제할 문자로 전달합니다.
>>> import string
>>> s.translate(None,string.ascii_lowercase)
'FOOFOOOBAR'
은 당신이 빠른 방법을 찾을 수 있습니다 의심하지 않지만, 누군가가 :) 동기를 부여하는 경우 다른 옵션을 비교하는 것이 timeit
있다.
내 첫 번째 방법은 ''.join(x for x in s if not x.islower())
당신이 속도를 사용 mgilson 대답을해야하는 경우가 많은 빠른 될 것입니다.
>>> timeit.timeit("''.join(x for x in 'FOOBarBaz' if not x.islower())")
3.318969964981079
>>> timeit.timeit("'FOOBarBaz'.translate(None, string.ascii_lowercase)", "import string")
0.5369198322296143
>>> timeit.timeit("re.sub('[a-z]', '', 'FOOBarBaz')", "import re")
3.631659984588623
>>> timeit.timeit("r.sub('', 'FOOBarBaz')", "import re; r = re.compile('[a-z]')")
1.9642360210418701
>>> timeit.timeit("''.join(x for x in 'FOOBarBaz' if x not in lowercase)", "lowercase = set('abcdefghijklmnopqrstuvwxyz')")
2.9605889320373535
+1 두 가지 현재 답변,하지만 두 가지 이유로이 선호합니다. # 1은 내가 항상 genexps를 사용하고 있기 때문에 구문에 대해 생각할 필요가 없습니다. 나는'번역 '과'매크 트랜스'가 어떻게 작동하는지 결코 기억할 수 없다. # 2는이 접근법이 더욱 강력하다는 것입니다. 요구 사항이 조금 변경되면 이는 생존 가능성이 더 큽니다. – DSM
@DSM -'번역 '과'maketrans'가 꽤 오래 일하는 것을 기억하기가 힘들었지 만, 익숙해졌습니다. 짜증나는 부분은 python3.x까지는'str.maketrans'가 없다는 것입니다. 실제로 번역 테이블을 사용하려면'import' 문자열이 필요합니다. – mgilson
소문자로 된 로컬 'set'을 만들면 성능이 어떻게 변하는 지 보는 것도 흥미로울 것입니다. 그렇다면'x.islower()'를보기보다는 세트의 멤버쉽을 테스트 할 수 있습니다. 물론, 미리 계산할 수 없다면 아무 것도 얻지 못할 것입니다. 당신은 반복 할 때마다 그렇게하고 싶지 않습니다. 약 30 %의 속도 향상을 위해 (경험적으로 만기가 된 - 실제로 타이밍은 없음), 생성기 표현식 대신 list-comp를 사용할 수도 있습니다. – mgilson
import re
remove_lower = lambda text: re.sub('[a-z]', '', text)
s = "FOObarFOOObBAR"
s = remove_lower(s)
print(s)
는 string 모듈은 더 이상 사용되지 아닌가요? –
@DiegoHerranz - 될 것 같지 않습니다. [참조 문서] (http://docs.python.org/3.4/library/string.html)에서 "depr"에 대한 단어 검색을 수행해도 아무 것도 나타나지 않습니다. 나는 그것의 대부분의 메소드가 내장 된'str' 타입의 앨리어스 (alias)이기 때문에 일반적인 소문이라고 생각합니다. 그래서 그들은 미래에 사용되지 않을 수도 있습니다. – mgilson
나는 (함수의 버전) 메소드가 무엇을 사용하지 않을 것이라고 생각합니다. 예를 들어, python 3.3에는'ascii_lowercase'와'punctuation'과 같은 상수와'Formatter'와'Template' 같은 클래스가 있습니다. 'rindex' 또는'split'은 없습니다. – DSM