2013-03-15 1 views

답변

18

나는 str.translate을 사용합니다. 변환 테이블에 None을 전달하면 h 제 단계 만 수행됩니다. 이 경우, 나는 ascii_lowercase을 삭제할 문자로 전달합니다.

>>> import string 
>>> s.translate(None,string.ascii_lowercase) 
'FOOFOOOBAR' 

은 당신이 빠른 방법을 찾을 수 있습니다 의심하지 않지만, 누군가가 :) 동기를 부여하는 경우 다른 옵션을 비교하는 것이 timeit있다.

+1

는 string 모듈은 더 이상 사용되지 아닌가요? –

+0

@DiegoHerranz - 될 것 같지 않습니다. [참조 문서] (http://docs.python.org/3.4/library/string.html)에서 "depr"에 대한 단어 검색을 수행해도 아무 것도 나타나지 않습니다. 나는 그것의 대부분의 메소드가 내장 된'str' 타입의 앨리어스 (alias)이기 때문에 일반적인 소문이라고 생각합니다. 그래서 그들은 미래에 사용되지 않을 수도 있습니다. – mgilson

+2

나는 (함수의 버전) 메소드가 무엇을 사용하지 않을 것이라고 생각합니다. 예를 들어, python 3.3에는'ascii_lowercase'와'punctuation'과 같은 상수와'Formatter'와'Template' 같은 클래스가 있습니다. 'rindex' 또는'split'은 없습니다. – DSM

9

내 첫 번째 방법은 ''.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 
+3

+1 두 가지 현재 답변,하지만 두 가지 이유로이 선호합니다. # 1은 내가 항상 genexps를 사용하고 있기 때문에 구문에 대해 생각할 필요가 없습니다. 나는'번역 '과'매크 트랜스'가 어떻게 작동하는지 결코 기억할 수 없다. # 2는이 접근법이 더욱 강력하다는 것입니다. 요구 사항이 조금 변경되면 이는 생존 가능성이 더 큽니다. – DSM

+0

@DSM -'번역 '과'maketrans'가 꽤 오래 일하는 것을 기억하기가 힘들었지 만, 익숙해졌습니다. 짜증나는 부분은 python3.x까지는'str.maketrans'가 없다는 것입니다. 실제로 번역 테이블을 사용하려면'import' 문자열이 필요합니다. – mgilson

+1

소문자로 된 로컬 'set'을 만들면 성능이 어떻게 변하는 지 보는 것도 흥미로울 것입니다. 그렇다면'x.islower()'를보기보다는 세트의 멤버쉽을 테스트 할 수 있습니다. 물론, 미리 계산할 수 없다면 아무 것도 얻지 못할 것입니다. 당신은 반복 할 때마다 그렇게하고 싶지 않습니다. 약 30 %의 속도 향상을 위해 (경험적으로 만기가 된 - 실제로 타이밍은 없음), 생성기 표현식 대신 list-comp를 사용할 수도 있습니다. – mgilson

2
import re 

remove_lower = lambda text: re.sub('[a-z]', '', text) 

s = "FOObarFOOObBAR" 
s = remove_lower(s) 

print(s) 
관련 문제