5

文字列に python のセット内のいずれかの文字が含まれているかどうかを調べる方法はありますか?

1 文字で行うのは簡単ですが、文字列に一連の不適切な文字が含まれているかどうかを確認する必要があります。

具体的には、次の文字列があるとします。

s = 'amanaplanacanalpanama~012345'

文字列に母音が含まれているかどうかを確認したい:

bad_chars = 'aeiou'

ファイル内の各行に対して for ループでこれを行います。

if [any one or more of the bad_chars] in s:
    do something

大きなファイルをスキャンしているので、より高速な方法があれば理想的です。また、すべての不正な文字をチェックする必要はありません --- 検索を終了するのに十分な文字が見つかった場合に限ります。

組み込み関数やこれを実装する簡単な方法があるかどうかはわかりませんが、まだ何も見つけていません。どんなポインタでも大歓迎です!

4

5 に答える 5

9
any((c in badChars) for c in yourString)

また

any((c in yourString) for c in badChars)  # extensionally equivalent, slower

また

set(yourString) & set(badChars)  # extensionally equivalent, slower

「検索を終了するのに十分なものに遭遇する限り。」- これは、最初の方法を使用する場合に当てはまります。

あなたはパフォーマンスに関心があると言っています。膨大な量のデータを扱っていない限り、パフォーマンスは問題にならないはずです。問題が発生した場合は、次を試すことができます。


正規表現

以前、モジュールを介して正規表現を使用reし、単一の文字クラスで構成される正規表現をプログラムで生成し、を使用するセクションをここに書きましたが、すべてが正しく機能しない可能性があることを警告しました。確かに、それをテストした後、それは事実であり、私はこの方法を絶対にお勧めしません. これを使用するには、正規表現文字クラスの (少し複雑な) サブ文法全体をリバース エンジニアリングする必要があります (たとえば、 like の後に、 likeまたは、または likeが続く場合、 likeをエスケープするだけで新しい意味が得られる場合があります)。[...].finditer\w][-\w


セット

操作が O(1) であるか O(N) であるかに応じて、str.__contains__まずテキスト/行をセットに変換して、in操作が O(1) であることを確認することが正当な場合があります。

badCharSet = set(badChars)
any((c in badChars) for c in yourString)

any((c in set(yourString)) for c in badChars)( Python コンパイラがどれだけ賢いかによっては、それをワンライナーにすることも可能かもしれません)


これを行ごとに行う必要は本当にありますか?

ファイル O(#lines*#badchars) のすべての行に対して 1 回行うよりも、ファイル全体 O(#badchars) に対して 1 回行う方が速い場合がありますが、漸近定数は問題にならない可能性があります。

于 2012-05-03T22:34:40.193 に答える
4

python のany関数を使用します。

if any((bad_char in my_string) for bad_char in bad_chars):
    # do something 
于 2012-05-03T22:35:25.217 に答える
2

これは非常に効率的で明確なはずです。セットを使用します:

#!/usr/bin/python

bad_chars = set('aeiou')

with open('/etc/passwd', 'r') as file_:
   file_string = file_.read()
file_chars = set(file_string)

if file_chars & bad_chars:
   print('found something bad')
于 2012-05-03T22:48:08.167 に答える
1

anyこの正規表現は、私の最小限のテストよりも 2 倍高速です。独自のデータで試してみてください。

r = re.compile('[aeiou]')
if r.search(s):
    # do something
于 2012-05-03T22:49:15.130 に答える
0

次の Python コードは、s に存在する場合、bad_chars の任意の文字を出力する必要があります。

for i in vowels:
    if i in your charset:
        #do_something

次のような例を使用して、組み込みの python any を使用することもできます。

>>> any(e for e in bad_chars if e in s)
True
于 2012-05-03T22:39:33.427 に答える