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 回行う方が速い場合がありますが、漸近定数は問題にならない可能性があります。