2014-02-05 36 views
0

什麼是比較兩個列表最有效的方法,並且只保留列表A中的元素,但對於非常大的數據集只保留列表中的元素?性能:在python中比較兩個列表中的字符串匹配

例子:

words = ['shoe brand', 'car brand', 'smoothies for everyone', ...] 
filters = ['brand', ...] 
# Matching function 
results = ['smoothies for everyone'] 

已經有somewhat similar questions但我目前正在處理超過100萬字和過濾器,從而導致正則表達式重載。我曾經做過一個簡單的過濾[我]用while循環測試[j]',但這看起來非常低效。

+0

使用'set()',查找會更快。 –

+0

你說*看起來效率低下,但*是*它呢?如果是這樣,可以通過使用散列函數避免爲* all *條目匹配正則表達式 - 只比較其匹配的散列條目。 –

+0

@BurhanKhalid:Set不檢查字符串是否包含,他們只是爲了完全匹配,請參閱示例 – oliver13

回答

2

我稍微嘗試修改@gnibbler版本:它使用集合運算交集而不是列表理解。我相信這個版本要快一點。

>>> words = ['shoe brand', 'car brand', 'smoothies for everyone'] 
>>> filters = {'brand'} 
>>> [w for w in words if not set(w.split()).intersection(filters)] 
['smoothies for everyone'] 
+0

你有沒有設定交叉點的基準實際上更快?我會假設設置的結構有點貴(哈希需要計算)。 –

+0

我剛剛通過timeit.Timer(test).timeit()測試了兩個版本,我的運行速度提高了3倍,但是應該在大型數據集上測試...... :( – Jiri

+0

我的想法是列表理解/迭代速度較慢除了圖書館功能...但是,你也是正確的 – Jiri

2

您可以篩選一組

>>> words = ['shoe brand', 'car brand', 'smoothies for everyone'] 
>>> filters = {'brand'} 
>>> [w for w in words if all(i not in filters for i in w.split())] 
['smoothies for everyone'] 

這工作更好比你filters[i] in words[j]因爲它不會過濾「冰沙」,如果「平滑」是在過濾器列表

+0

有趣的方法,儘管你應該通過在過濾器和單詞中加入空格(''+ word +'')來避免你的顧慮。我會嘗試哪一個更快!謝謝! – oliver13

相關問題