2 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
我自己無(wú)法測(cè)試它,但如果您將所有字符串與不在任何字符串中的字符連接起來,則有可能:
concat_list = '$'.join(l)
現(xiàn)在使用 simple .find('$3,')
,它會(huì)更快。如果所有字符串都相對(duì)較短,則可能會(huì)發(fā)生這種情況。從現(xiàn)在開始,所有字符串都在內(nèi)存中的一個(gè)位置。
如果文本中唯一字母的數(shù)量很少,您可以使用Abrahamson-Kosaraju
實(shí)際的方法和時(shí)間復(fù)雜度O(n)
另一種方法是使用 joblib,當(dāng)?shù)谝粋€(gè)線程正在檢查時(shí)創(chuàng)建n
線程,當(dāng)一個(gè)線程找到模式時(shí)它會(huì)停止其他線程。所以時(shí)間復(fù)雜度為。i
i + k * n
O(naive algorithm / n)

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
301由于您的實(shí)際字符串在按制表符拆分字符串后由相對(duì)較短的標(biāo)記(例如 )組成,因此您可以構(gòu)建一個(gè)字典,將第一個(gè)標(biāo)記的每個(gè)可能長(zhǎng)度作為鍵,以便后續(xù)查找平均時(shí)間僅需O ( 1)復(fù)雜。
用相反順序的列表值構(gòu)建字典,以便列表中以每個(gè)不同字符開頭的第一個(gè)值將保留在最終字典中:
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']會(huì)回來的'301\t301\t51.806763'。
如果您只需要測(cè)試每個(gè)第一個(gè)標(biāo)記作為一個(gè)整體,而不是前綴,您可以簡(jiǎn)單地將第一個(gè)標(biāo)記作為鍵:
d = {s.split('\t')[0]: s for s in reversed(l)}
這樣d['301']就會(huì)返回'301\t301\t51.806763'。
添加回答
舉報(bào)