2 回答
TA貢獻1785條經(jīng)驗 獲得超4個贊
我自己無法測試它,但如果您將所有字符串與不在任何字符串中的字符連接起來,則有可能:
concat_list = '$'.join(l)
現(xiàn)在使用 simple .find('$3,'),它會更快。如果所有字符串都相對較短,則可能會發(fā)生這種情況。從現(xiàn)在開始,所有字符串都在內(nèi)存中的一個位置。
如果文本中唯一字母的數(shù)量很少,您可以使用Abrahamson-Kosaraju實際的方法和時間復雜度O(n)
另一種方法是使用 joblib,當?shù)谝粋€線程正在檢查時創(chuàng)建n線程,當一個線程找到模式時它會停止其他線程。所以時間復雜度為。ii + k * nO(naive algorithm / n)
TA貢獻1876條經(jīng)驗 獲得超6個贊
301由于您的實際字符串在按制表符拆分字符串后由相對較短的標記(例如 )組成,因此您可以構(gòu)建一個字典,將第一個標記的每個可能長度作為鍵,以便后續(xù)查找平均時間僅需O ( 1)復雜。
用相反順序的列表值構(gòu)建字典,以便列表中以每個不同字符開頭的第一個值將保留在最終字典中:
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'。
添加回答
舉報
