2 回答

TA贡献1785条经验 获得超4个赞
我自己无法测试它,但如果您将所有字符串与不在任何字符串中的字符连接起来,则有可能:
concat_list = '$'.join(l)
现在使用 simple .find('$3,')
,它会更快。如果所有字符串都相对较短,则可能会发生这种情况。从现在开始,所有字符串都在内存中的一个位置。
如果文本中唯一字母的数量很少,您可以使用Abrahamson-Kosaraju
实际的方法和时间复杂度O(n)
另一种方法是使用 joblib,当第一个线程正在检查时创建n
线程,当一个线程找到模式时它会停止其他线程。所以时间复杂度为。i
i + k * n
O(naive algorithm / n)

TA贡献1876条经验 获得超6个赞
301由于您的实际字符串在按制表符拆分字符串后由相对较短的标记(例如 )组成,因此您可以构建一个字典,将第一个标记的每个可能长度作为键,以便后续查找平均时间仅需O ( 1)复杂。
用相反顺序的列表值构建字典,以便列表中以每个不同字符开头的第一个值将保留在最终字典中:
d = {s[:i + 1]: s for s in reversed(l) for i in range(len(s.split('\t')[0]))}
所以给出:
l = ['301\t301\t51.806763\n', '301\t302\t46.970094\n',
'301\t303\t39.962393\n', '301\t304\t18.943836\n',
'301\t305\t11.064584\n', '301\t306\t4.751911\n']
d['3']会回来的'301\t301\t51.806763'。
如果您只需要测试每个第一个标记作为一个整体,而不是前缀,您可以简单地将第一个标记作为键:
d = {s.split('\t')[0]: s for s in reversed(l)}
这样d['301']就会返回'301\t301\t51.806763'。
添加回答
举报