あなたが与えられた他の解決策は、正しく、理解しやすく、優れた Python であり、セットが小さい場合はかなりのパフォーマンスを発揮します。
ただし、インデックスを使用すると、必要なことを (もちろん、メモリとセットアップ時間にかなりのオーバーヘッドがかかります; TANSTAAFL で)はるかに迅速に行うことができます。そして、このインデックスは、データがどれほど大きくなっても一定のパフォーマンスを維持します (すべてを保持するのに十分なメモリがあると仮定します)。多くの検索を行っている場合、これによりスクリプトが大幅に高速化されます。そして、記憶力はそれほど悪くない...
dict
キーがインデックス内の項目からの可能なすべての部分文字列set
であり、値がその部分文字列を含む項目の である を作成します。
from collections import defaultdict
class substring_index(defaultdict):
def __init__(self, seq=()):
defaultdict.__init__(self, set)
for item in seq:
self.add(item)
def add(self, item):
assert isinstance(item, str) # requires strings
if item not in self[item]: # performance optimization for duplicates
size = len(item) + 1
for chunk in range(1, size):
for start in range(0, size-chunk):
self[item[start:start+chunk]].add(item)
seto = substring_index()
seto.add('C123.45.32')
seto.add('C2345.345.32')
print(len(seto)) # 97 entries for 2 items, I wasn't kidding about the memory
これで、部分文字列がインデックスに含まれているかどうかを簡単に (そして即座に) テストできます。
print('C' in seto) # True
または、特定の部分文字列を含むすべての文字列を簡単に見つけることができます。
print(seto['C']) # set(['C2345.345.32', 'C123.45.32'])
これは、「で始まる」および「で終わる」一致を含めたり、大文字と小文字を区別しないように、非常に簡単に拡張できます。
同じアイデアのメモリ消費量が少ないバージョンについては、試行を調べてください。