第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取以大列表開頭的第一個值的最有效方法

獲取以大列表開頭的第一個值的最有效方法

婷婷同學_ 2023-06-06 14:38:41
我有一個非常大的列表,其中包含超過 100M 的字符串。該列表的示例如下所示:l = ['1,1,5.8067',     '1,2,4.9700',     '2,2,3.9623',     '2,3,1.9438',     '2,7,1.0645',      '3,3,8.9331',     '3,5,2.6772',     '3,7,3.8107',     '3,9,7.1008']我想獲得以“3”開頭的第一個字符串。為此,我使用了一個 lambda 迭代器,然后使用 next() 來獲取第一項:next(filter(lambda i: i.startswith('3,'), l))Out[1]: '3,3,8.9331'考慮到列表的大小,不幸的是,對于我必須一遍又一遍地執(zhí)行的過程,此策略仍然需要相對較長的時間。我想知道是否有人可以想出一種更快、更有效的方法。我對替代策略持開放態(tài)度。
查看完整描述

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)


查看完整回答
反對 回復 2023-06-06
?
HUX布斯

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'。


查看完整回答
反對 回復 2023-06-06
  • 2 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號