最近博主在分析資料庫慢查詢日誌的時候想使用python把重複或者相似的sql去掉,這樣就不用看很多類似的sql了。重複相同的資料去掉比較簡單,可以使用內建的set命令完成。
例如:
l1 = ['a','b','c','d','e','a','b','f']
l2 = list(set(l1))
print l2
這個用python很容易實現。
如何去除相似的字串,即我這邊用到的sql語句?好在python方便,有內建庫difflib可以使用。difflib計算相似性的方法類似如下:
>>> import difflib
>>> difflib.SequenceMatcher(None, 'abcde', 'abcde').ratio()
1.0
>>> difflib.SequenceMatcher(None, 'abcde', 'zbcde').ratio()
0.80000000000000004
>>> difflib.SequenceMatcher(None, 'abcde', 'zyzzy').ratio()
0.0
有了這個方法,讓博主我就先理下思路。
python-list-similar-remove
先從list的第一個元素開始,遍曆該元素後的每個元素並比較。如果判斷兩個字串相似,那麼就把該元素刪除。遍曆完後就從第二個元素開始,依次迴圈,最終得到的就是去除相似元素後的列表了。
暫時博主想到就是這個辦法,如果有效率更高更好的歡迎交流。代碼類似如下:
def remove_similar(lists,similarity=0.9):
i=0
l=len(lists)
while i<l:
j=i+1
while j<l:
seq=difflib.SequenceMatcher(None,lists[i],lists[j])
ratio=seq.ratio()
if ratio>=similarity:
del lists[j]
l=l-1
else:
j+=1
i+=1
return lists
上面函數預設相似性設定的是0.9,可以按照你的要求修改。
比較容易記憶的是用內建的set
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
print l2
還有一種據說速度更快的,沒測試過兩者的速度差別
l1 = ['b','c','d','b','c','a','a']
l2 = {}.fromkeys(l1).keys()
print l2
這兩種都有個缺點,祛除重複元素後排序變了:
1 ['a', 'c', 'b', 'd']
如果想要保持他們原來的排序:
用list類的sort方法
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print l2
也可以這樣寫
l1 = ['b','c','d','b','c','a','a']
l2 = sorted(set(l1),key=l1.index)
print l2
也可以用遍曆
l1 = ['b','c','d','b','c','a','a']
l2 = []
for i in l1:
if not i in l2:
l2.append(i)
print l2
上面的代碼也可以這樣寫
l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not i in l2]
print l2
這樣就可以保證排序不變了:
?1 ['b', 'c', 'd', 'a']