python对list去重的各种方法

本文介绍了几种Python中去除列表重复元素的方法,包括直观方法、使用set、按索引排序及利用itertools.groupby和reduce函数。每种方法都有其特点,如是否保留原有顺序等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接 :https://www.the5fire.com/python-remove-duplicates-in-list.html

直观方法

最简单的思路就是:

ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)

print news_ids

这样也可行,但是看起来不够爽。

用set

另外一个解决方案就是用set:

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))

这样的结果是没有保持原来的顺序。

按照索引再次排序

最后通过这种方式解决:

ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(key=ids.index)   # 感谢网友:@Magic 指正。

使用itertools.grouby

文章一开始就提到itertools.grouby, 如果不考虑列表顺序的话可用这个:

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)

for k, g in it:
    print k

关于itertools.groupby的原理可以看这里:http://docs.python.org/2/library/itertools.html#itertools.groupby

网友补充:用reduce

网友reatlk留言给了另外的解决方案。我补充并解释到这里:

In [5]: ids = [1,4,3,3,4,2,3,4,5,6,1]

In [6]: func = lambda x,y:x if y in x else x + [y]

In [7]: reduce(func, [[], ] + ids)
Out[7]: [1, 4, 3, 2, 5, 6]

上面是我在ipython中运行的代码,其中的 lambda x,y:x if y in x else x + [y] 等价于 lambda x,y: y in x and x orx+[y] 。

思路其实就是先把ids变为[[], 1,4,3,......] ,然后在利用reduce的特性。reduce解释参看这里:http://docs.python.org/2/library/functions.html#reduce

### 方法概述 在 Python 中,有多种方式可以实现列表的操作。以下是六种常见的方法来移除列表中的复项: #### 方法一:使用 `set` 数据结构 通过将列表转换为集合(`set`),可以自动除其中的复元素,因为集合不允许存在复值。 ```python test_list = [1, 3, 5, 6, 3, 5, 6, 1] res = list(set(test_list)) print("The list after removing duplicates : " + str(res)) # 输出可能无序 ``` 这种方法简单高效,但由于集合不保留顺序,因此最终的结果可能会改变原始列表中元素的位置[^1]。 #### 方法二:利用列表推导式保持顺序 如果需要保留原列表中元素的顺序,则可以通过列表推导式配合条件判断完成这一目标。 ```python test_list = [1, 3, 5, 6, 3, 5, 6, 1] seen = set() res = [x for x in test_list if not (x in seen or seen.add(x))] print("The list after removing duplicates : " + str(res)) ``` 此代码片段不仅实现了功能,还维持了原有数据的排列次序。 #### 方法三:借助 Pandas 的 `.drop_duplicates()` 函数 对于更复杂的数据处理场景,Pandas 提供了一个便捷函数用于删除 DataFrame 或 Series 对象内的冗余记录。 ```python import pandas as pd test_series = pd.Series([1, 3, 5, 6, 3, 5, 6, 1]) res = test_series.drop_duplicates().tolist() print("The list after removing duplicates : " + str(res)) ``` 上述例子展示了如何运用 Pandas 库来进行高效的工作[^2]。 #### 方法四:传统循环法 这是最基础也是最容易理解的一种做法——遍历整个输入序列并逐一检查当前项目是否已经存在于结果集中;如果不是的话就将其加入到新的数组里头。 ```python test_list = [1, 3, 5, 6, 3, 5, 6, 1] res = [] for i in test_list: if i not in res: res.append(i) print("The list after removing duplicates : " + str(res)) ``` 尽管这种策略易于理解和实施,但它的时间复杂度较高(O(n²)),当面对大规模数据集时性能表现不佳。 #### 方法五:字典键特性法 由于字典类型的 key 是唯一的,所以我们可以巧妙地利用这一点来做文章: ```python test_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] dict.fromkeys(test_list).keys() # 结果会是一个 dict_keys object 类型的对象, # 如果想要得到list形式则需进一步转化成list(dict_keys_object) ``` 注意这里我们只讨论不可变对象作为key的情况(比如字符串),如果是可变对象像lists就不能直接这样用了. #### 方法六:OrderedDict.fromkeys() 为了既能够复又能保存原有的先后关系,还可以考虑采用collections模块下的OrderedDict类所提供的fromkeys静态方法. ```python from collections import OrderedDict test_list = [1, 3, 5, 6, 3, 5, 6, 1] res = list(OrderedDict.fromkeys(test_list)) print("The list after removing duplicates : " + str(res)) ``` 这种方式同样能很好地兼顾效率与效果,在实际应用中有较高的参考价值。 ### 性能对比分析 不同的算法其时间空间消耗各有千秋,具体选用哪一种取决于应用场景以及个人偏好等因素。通常来说基于哈希表的操作如sets/dicts往往具有较好的平均情况下的运行速度O(1),但对于非常大的数据量或者特殊情况下也可能退化至线性甚至平方级别的时间开销;而纯迭代式的解决方案虽然逻辑清晰直观易懂但普遍缺乏竞争力除非是在极小规模下才显得合理可行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值