最近博主在分析数据库慢查询日志的时候想使用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
有了这个方法,让博主我就先理下思路。
先从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,可以按照你的要求修改。
试用后效果好像不错,原来几百条的sql就只剩几条了。。。
参考链接:
https://docs.python.org/2/library/difflib.html