Python实现列表删除重复元素的三种常用方法分析

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府
这篇文章主要介绍了Python实现列表删除重复元素的三种常用方法,结合实例形式对比分析了Python针对列表元素的遍历、判断、转换等相关操作技巧,需要的朋友可以参考下

listA = ['python','语','言','是','一','门','动','态','语','言']

方法1,对列表调用排序,从末尾依次比较相邻两个元素,遇重复元素则删除,否则指针左移一位重复上述过程:

def deleteDuplicatedElementFromList(list):
    list.sort();
    print("sorted list:%s" % list)
    length = len(list)
    lastItem = list[length - 1]
    for i in range(length - 2,-1,-1):
        currentItem = list[i]
        if currentItem == lastItem:
            list.remove(currentItem)
        else:
            lastItem = currentItem
    return list

方法2,设一临时列表保存结果,从头遍历原列表,如临时列表中没有当前元素则追加:

def deleteDuplicatedElementFromList2(list):
    resultList = []
    for item in list:
        if not item in resultList:
            resultList.append(item)
    return resultList

方法3,利用python中集合元素惟一性特点,将列表转为集合,将转为列表返回:

def deleteDuplicatedElementFromList3(listA):
    #return list(set(listA))
    return sorted(set(listA), key = listA.index)

执行结果:

print(deleteDuplicatedElementFromList(listA))
#sorted list:['python', '一', '动', '态', '是', '言', '言', '语', '语', '门']
#['python', '一', '动', '态', '是', '言', '语', '门']
print(deleteDuplicatedElementFromList2(listA))
#['python', '语', '言', '是', '一', '门', '动', '态']
print(deleteDuplicatedElementFromList3(listA))
#['python', '语', '言', '是', '一', '门', '动', '态']

分析:

方法1,逻辑复杂,临时变量保存值消耗内存,返回结果破坏了原列表顺序,效率最差
方法2,直接调用append方法原处修改列表,逻辑清晰,效率次之
方法3,极度简洁,使用python原生方法效率最高

非常感谢你的阅读
大学的时候选择了自学python,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习python核心知识,深入的研习计算机基础知识,整理好了,我放在我们的微信公众号《程序员学府》,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!

其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?[点击加入]
想做你自己想成为高尚人,加油!

<think>嗯,用户问的是如何用Python去除列表中的重复元素,需要示例代码。我得先回忆一下常见的几种方法。首先,我记得用集合(set)来去重是最简单的方法,因为集合不允许重复元素。比如把列表转成集合再转回来,但这样会打乱原来的顺序。所以如果用户在意顺序的话,可能需要别的方法。 然后,用户提供的引用里提到了几种方法。引用2和5提到了使用set,但引用4和5还提到了用列表推导式配合循环来保持顺序。比如遍历原列表,只添加不在新列表中的元素。这种方法虽然保持了顺序,但效率可能不高,尤其是列表很大的时候,因为每次都要检查元素是否在新列表里,时间复杂度是O(n²)。 引用5还提到了用numpy.unique,这可能适合处理大数据量,但需要安装numpy,可能用户不一定有。另外,Python 3.7以上版本字典的键保持插入顺序,所以可以用dict.fromkeys,这样也能去重并保持顺序,这可能是一个高效的方法。 用户可能的需求不仅仅是去重,还可能关心保持元素顺序、处理大数据量时的效率,或者是否需要保留原来的数据类型。比如,如果列表中的元素是可变类型,比如字典,用集合可能会报错,这时候可能需要其他方法。 还要考虑代码的简洁性和可读性。比如,使用集合的方法代码最少,但顺序问题需要注意。如果用户需要保持顺序,应该推荐使用字典的方法或者列表推导式。另外,引用4中的示例用了列表推导式,但其实是利用副作用来添加元素,这种方式虽然有效,但可能不够直观。 可能还需要提到其他方法,比如使用pandas库的drop_duplicates,但用户可能更倾向于标准库的方法。所以总结下来,主要方法有:集合法、字典法、列表遍历法,可能还有使用生成式或者第三方库的方法。 然后需要给出示例代码,比如引用2中的set示例,引用4中的列表推导式,引用5中的numpy方法,以及字典方法。同时要指出各方法的优缺点,比如集合法不保持顺序,字典法和列表推导式保持顺序,numpy适合数值处理等。 还要注意用户可能遇到的问题,比如列表中元素是不可哈希的类型,这时候用集合或字典会报错,需要处理异常或者换其他方法。不过用户的问题可能比较基础,暂时不需要涉及这些复杂情况。 最后,确保回答结构清晰,分点列出不同方法,代码示例正确,并说明适用场景。可能还需要在相关问题里引导用户进一步了解性能优化或者处理其他数据类型的问题。</think>根据需求整理Python去除列表重复元素的5种常用方法及对应示例代码: ### 一、集合去重法(无序) $$O(n)时间复杂度$$ ```python def remove_duplicates_set(lst): return list(set(lst)) # 集合自动过滤重复项 nums = [3,1,2,3,4,2,5] print(remove_duplicates_set(nums)) # 输出可能为[1,2,3,4,5] ``` 特点:效率最高但丢失原顺序[^2] ### 二、字典键去重法(有序) $$O(n)时间复杂度$$ ```python def remove_duplicates_ordered(lst): return list(dict.fromkeys(lst)) # 利用字典键唯一性 words = ['apple', 'banana', 'apple', 'orange'] print(remove_duplicates_ordered(words)) # 保持顺序输出['apple','banana','orange'] ``` 特点:Python 3.7+版本保持插入顺序[^5] ### 三、列表推导式(有序) $$O(n^2)时间复杂度$$ ```python def remove_duplicates_loop(lst): unique = [] [unique.append(x) for x in lst if x not in unique] return unique data = [2,2,1,5,3,3] print(remove_duplicates_loop(data)) # 输出[2,1,5,3] ``` 特点:小数据量适用,保留原始顺序[^4] ### 四、Numpy库方法 $$适合数值型大数据$$ ```python import numpy as np def remove_duplicates_numpy(lst): return np.unique(lst).tolist() arr = [5,5,3,7,3] print(remove_duplicates_numpy(arr)) # 输出[3,5,7] ``` 特点:需安装numpy库,自动排序[^5] ### 五、生成器表达式 $$内存优化版$$ ```python def remove_duplicates_gen(lst): seen = set() return [x for x in lst if not (x in seen or seen.add(x))] colors = ['red','blue','red','green'] print(remove_duplicates_gen(colors)) # 输出['red','blue','green'] ``` 特点:利用短路逻辑实现高效去重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值