2013-03-15 16 views

Odpowiedz

18

Użyłbym str.translate. Po przejściu None dla tabeli tłumaczeń wykonywany jest tylko krok usuwania. W takim przypadku przekazuję ascii_lowercase jako litery do usunięcia.

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

Wątpię znaleźć szybszy sposób, ale zawsze timeit porównać różne opcje, jeśli ktoś jest motywowane :).

+1

nie jest moduł ciąg przestarzałe? –

+0

@DiegoHerranz - Nie wydaje się być. Wykonywanie wyszukiwania słowa "depr" w [dokumentach referencyjnych] (http://docs.python.org/3.4/library/string.html) nie powoduje żadnych zmian. Myślę, że to powszechna plotka, ponieważ większość metod w niej zawartych to po prostu aliasy na wbudowanym typie 'str', więc mogą być przestarzałe w przyszłości. – mgilson

+2

Myślę, że to, co było przestarzałe, to metody (wersje funkcji). Na przykład w pythonie 3.3 są tylko stałe takie jak 'ascii_wolcase' i' interpunkcja' oraz klasy takie jak 'Formatter' i' Szablon'. Nie ma "rindex" ani "split". – DSM

9

Moje pierwsze podejście byłoby ''.join(x for x in s if not x.islower())

Jeśli potrzebujesz prędkości użycie mgilson odpowiedź, to jest o wiele szybciej.

>>> 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 do obu obecnych odpowiedzi, ale wolę to z dwóch powodów. # 1 jest to, że cały czas używam genexps, więc nie muszę myśleć o składni. Nigdy nie pamiętam jak działają 'translate' i' maketrans'. # 2 jest to, że takie podejście jest bardziej niezawodne: jeśli wymagania nieco się zmienią, jest bardziej prawdopodobne, że przetrwają. – DSM

+0

@DSM - Ciężko mi było sobie przypomnieć, jak "translate" i "maketrans" działają przez jakiś czas, ale przyzwyczaiłem się do tego. Denerwujące jest to, że nie ma żadnego 'str.maketrans' dopóki python3.x, więc w rzeczywistości potrzebujesz' import' string, jeśli rzeczywiście chcesz użyć tabeli tłumaczeń. – mgilson

+1

To może być interesujące zobaczyć, jak zmienia się wydajność na tej, jeśli utworzysz lokalny "zestaw" małych liter. Wtedy możesz przetestować członkostwo w zestawie zamiast patrzeć na 'x.islower()'. Oczywiście prawdopodobnie nic nie dostaniesz, chyba że możesz wstępnie skompilować zestaw. Nie chcesz tego robić w każdej iteracji. Aby przyspieszyć to o około 30% (w oparciu o moje doświadczenie empiryczne - Brak rzeczywistych czasów), można również użyć kompilatora listy zamiast wyrażenia generatora. – mgilson

2
import re 

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

s = "FOObarFOOObBAR" 
s = remove_lower(s) 

print(s) 
Powiązane problemy