您获得的其他解决方案是正确的、可理解的和良好的 Python,如果您的集合很小,它们的性能也相当不错。
然而,使用索引可以更快地做你想做的事(当然,在内存和设置时间方面有相当大的开销;TANSTAAFL) 。无论您的数据有多大(假设您有足够的内存来保存所有数据),该索引都会保持恒定的性能。如果您要进行大量查找,这可以使您的脚本更快。而且记忆力也没有想象的那么差...
我们将构建一个dict
,其中键是索引中项目的每个可能的子字符串set
,值是包含该子字符串的项目的 a。
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'])
这可以很容易地扩展到包括“开始于”和“结束于”匹配,或者不区分大小写。
对于相同想法的内存密集度较低的版本,请查看Trys。