文字列と文字列のリストがあるとしましょう:
a = 'ABCDEFG'
b = ['ABC', 'QRS', 'AHQ']
文字列 a のセクションと完全に一致するリスト b の文字列を取り出すにはどうすればよいですか? したがって、戻り値は次のようになります['ABC']
最も重要な問題は、数千万の文字列があるため、時間効率が不可欠であることです。
文字列と文字列のリストがあるとしましょう:
a = 'ABCDEFG'
b = ['ABC', 'QRS', 'AHQ']
文字列 a のセクションと完全に一致するリスト b の文字列を取り出すにはどうすればよいですか? したがって、戻り値は次のようになります['ABC']
最も重要な問題は、数千万の文字列があるため、時間効率が不可欠であることです。
b の最初の一致のみが必要な場合:
next((s for s in b if s in a), None)
これには、一致が見つかるとすぐに短絡するという利点がありますが、他のリスト ソリューションは続行されます。一致するものが見つからない場合は、 が返されNone
ます。
Pythonの部分文字列検索x in a
は、一般的なケースではすでにかなり最適化されている(CPythonの場合はCでコーディングされている)ため、特に純粋なPythonコードでは、一般的にこれに勝るものはありません。
ただし、より専門的なケースがある場合は、はるかにうまくいくことができます。
たとえば、変更されないb
1つの巨大な静的文字列内ですべてを検索する必要がある数百万の文字列の任意のリストがある場合a
、前処理は大きな違いa
を生む可能性があります。(これは、パターンの前処理が重要である通常の場合とは逆であることに注意してください。)
一方、一致する可能性が低いと予想さb
れ、事前にリスト全体を入手している場合は、何らかの方法で整理することで、おそらく大きな利益を得ることができますb
。たとえば、すでに失敗して"ABCD"
いる場合は検索しても意味がありません。両方を"ABC"
検索する必要があり、最初に検索してから、その後に続くかどうかを確認できる場合は、繰り返す必要はありません。など(数百万の要素がある場合でも、すべてを最適に十分近い単一の正規表現にマージすることも可能かもしれませんが、それはおそらく答えではありません。)"ABC"
"ABD"
"AB"
"C"
"D"
b
しかし、事前に推測するのは困難です。あなたが私たちに提供した以上の情報がなく、正確にどのアルゴリズムが必要かを推測することはできません。
ウィキペディアには、文字列検索アルゴリズムの非常に優れた高レベルの概要があります。一般的なパターンマッチングを専門とするWebサイトもあり、少し時代遅れのようですが、とにかく過去3年間に発明されたアルゴリズムが必要になるとは思えません。
答え:
(x for x in b if x in a )
これにより、一致するジェネレーターのリストとなるジェネレーターが返されます。最初のものを取るか、それをループします。
In [3]: [s for s in b if s in a]
Out[3]: ['ABC']
b
私のマシンでは、 20,000,000個の要素が含まれている場合(質問の文字列と同様の文字列でテストされa
、含まれている場合) 、これには約3秒かかります。b