16

Pythonで(プレーンまたはnumpyを使用して)文字列からすべての小文字の部分文字列を削除する効率的な方法は何sですか?

s = "FOObarFOOObBAR"
remove_lower(s) => "FOOFOOBAR"
4

3 に答える 3

26

Python3.xの答え:

文字列変換テーブルを作成できます。その変換テーブルが作成されると、それを繰り返し使用できます。

>>> import string
>>> table = str.maketrans('', '', string.ascii_lowercase)
>>> s = 'FOObarFOOObBAR'
>>> s.translate(table)
'FOOFOOOBAR'

このように使用すると、最初の引数の値が2番目の引数の値(存在する場合)にマップされます。存在しない場合は、IDマッピングであると見なされます。3番目の引数は、削除する値のコレクションです。


気にする人のための古いpython2.xの答え:

私は使用しますstr.translateNone変換テーブルに合格した場合は、削除ステップのみが実行されます。この場合、ascii_lowercase削除する文字としてを渡します。

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

より速い方法が見つかるとは思えませんが、timeit誰かがやる気がある場合は、常にさまざまなオプションを比較する必要があります:)。

于 2013-03-15T16:35:18.917 に答える
15

私の最初のアプローチは''.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
于 2013-03-15T16:37:11.193 に答える
4
import re

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

s = "FOObarFOOObBAR"
s = remove_lower(s)

print(s)
于 2013-03-15T16:51:37.470 に答える