Jaki jest skuteczny sposób w Pythonie (zwykły lub za pomocą numpy), aby usunąć cały ciąg znaków małej litery z ciągu s
?szybki sposób na usunięcie ciągów znaków z małych liter?
Odpowiedz
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 :).
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
+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
@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
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
import re
remove_lower = lambda text: re.sub('[a-z]', '', text)
s = "FOObarFOOObBAR"
s = remove_lower(s)
print(s)
- 1. Szybki sposób inicjalizacji listy numerowanych ciągów znaków?
- 2. Szybki sposób na usunięcie linii w netBeans
- 3. Nieczułe na wielkość liter porównywanie ciągów znaków
- 4. Najlepszym sposobem sprawdzania ciągów kwerend dużych/małych liter
- 5. Porównywanie ciągów javascript bez rozróżniania wielkich i małych liter
- 6. Szybki sposób na usunięcie wszystkich wierszy obiektu datatable
- 7. szybki sposób łączenia ciągów w nodeJS/JavaScript
- 8. Łatwy sposób na usunięcie akcentów UTF-8 z ciągu znaków?
- 9. Jaki jest najlepszy sposób na usunięcie pierwszego elementu z tablicy?
- 10. Inteligentny sposób na znalezienie kodowania ciągów znaków?
- 11. Adresy URL małych liter i końcowy ukośnik
- 12. Dlaczego PostgreSQL domyślnie wszystko do małych liter?
- 13. Pamięciowy sposób przechowywania ciągów znaków
- 14. NewtonSoft JsonSerializer - Właściwości i słownik małych liter
- 15. Najszybszy sposób na usunięcie białych spacji w ciągu znaków
- 16. Adresy URL małych liter w ASP.NET MVC
- 17. Metoda JavaScript Namingowanie małych i wielkich liter
- 18. JavaScript do konwersji małych liter na wielkie litery
- 19. Jak wymusić na mysql LIKE rozróżnianie wielkich i małych liter?
- 20. szybki sposób na przesyłanie dużej liczby małych plików za pomocą PHP
- 21. Usunięcie wszystkich spacji z ciągu znaków
- 22. Tablica ciągów ciągów znaków
- 23. GetHashCode() z kluczami ciągów znaków
- 24. szybki sposób na odczyt z StringIO, aż napotka jakiś bajt.
- 25. Pythonowy sposób generowania rotacji ciągów znaków
- 26. Lista niewrażliwa na wielkość liter
- 27. Szybki sposób ręcznego modyfikowania numeru
- 28. Usunięcie wszystkich wystąpień kilku znaków z ciągu znaków
- 29. Kompresja małych ciągów, z czego tworzyć zewnętrzny słownik?
- 30. Losowy ciąg znaków z listy ciągów znaków
nie jest moduł ciąg przestarzałe? –
@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
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