Python去除列表list重复或相似元素的方法

最近博主在分析数据库慢查询日志的时候想使用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']

时间: 2024-02-08 05:36:02

Python去除列表list重复或相似元素的方法的相关文章

Python去除列表中重复元素的方法_python

本文实例讲述了Python去除列表中重复元素的方法.分享给大家供大家参考.具体如下: 比较容易记忆的是用内置的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 这两种都有个缺点,祛除重复元素后排序变了: ['a', 'c',

python删除列表中重复记录的方法

  这篇文章主要介绍了python删除列表中重复记录的方法,涉及Python操作列表的相关技巧,需要的朋友可以参考下 ? 1 2 3 4 def removeListDuplicates(seq): seen = set() seen_add = seen.add return [ x for x in seq if x not in seen and not seen_add(x) ] 希望本文所述对大家的Python程序设计有所帮助.

JavaScript实现向OL列表内动态添加LI元素的方法_javascript技巧

本文实例讲述了JavaScript实现向OL列表内动态添加LI元素的方法.分享给大家供大家参考.具体分析如下: JavaScript向OL列表内动态添加LI元素的方法,下面JS代码每次点击按钮都会想OL列表中动态添加一个LI <script type="text/javascript"> function addItem() { var myitem = document.getElementById("ItemToAdd").value; var my

PHP获取数组中重复最多的元素的方法

 代码如下 复制代码 <?php /**  *  * @author http://www.111cn.net  * Created on 2014-4-1  * @param   array $array  * @param   int [optional] $length  * @return  array  */ function mostRepeatedValues($array,$length=0){     if(empty($array) or !is_array($array))

python求列表交集的方法汇总_python

本文实例汇总了python求列表交集的方法.分享给大家供大家参考.具体方法如下: 交集对于给定的两个集合A 和 集合B 的交集是指含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合叫交集了,下面给出几个python求列表交集例子供大家参考. 方法1 遍历b1,如果某个元素同时也存在于b2中,则返回 复制代码 代码如下: b1=[1,2,3] b2=[2,3,4] b3 = [val for val in b1 if val in b2] print b3 运行结果如下 复制代码 代码如

运用javascript如何去除数组中重复的数字或者字符串?

问题描述 运用javascript如何去除数组中重复的数字或者字符串? 运用javascript如何去除数组中重复的数字或者字符串?谢谢了.方法越多越好,谢谢. 解决方案 JavaScript实现数组去除重复整理 javascript 去除数组中重复项的几种方法 解决方案二: 本人只会用JAVA写

在Python的列表中利用remove()方法删除元素的教程

  这篇文章主要介绍了在Python的列表中利用remove()方法删除元素的教程,是Python入门中的基础知识,注意其和pop()方法的区别,需要的朋友可以参考下 remove()方法从列表中删除第一个obj. 语法 以下是remove()方法的语法: ? 1 list.remove(obj) 参数 obj -- 这是可以从列表中移除该对象 返回值 此方法不返回任何值,但从列表中删除给定的对象 例子 下面的例子显示了remove()方法的使用 ? 1 2 3 4 5 6 7 8 #!/usr

Python统计列表中的重复项出现的次数的方法_python

本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴.具体方法如下: 对一个列表,比如[1,2,2,2,2,3,3,3,4,4,4,4],现在我们需要统计这个列表里的重复项,并且重复了几次也要统计出来. 方法1: mylist = [1,2,2,2,2,3,3,3,4,4,4,4] myset = set(mylist) #myset是另外一个列表,里面的内容是mylist里面的无重复 项 for item in myset: prin

c语言-关于去除数组中重复元素的问题

问题描述 关于去除数组中重复元素的问题 源代码:#include #include int main() { int *a; int n,i,j; scanf("%d",n); a=(int *)malloc(n*sizeof(int)); for (i=0;i<n;i++) scanf("%d",&a[i]); for (i=0;i<n;i++) for (j=1;j<n;j++) if (a[i]==a[j]) printf (&quo