python - list去重

本文介绍了三种Python中列表去重的方法:遍历列表去除重复项、使用set自动去重及结合索引保持顺序去重。每种方法都有其优缺点,如保持元素顺序或操作简便。

1. 遍历列表

lst = [3, 4, 5, 1, 6, 2, 7, 3, 1, 2]
new_lst = []
for i in lst:
  if i not in new_lst:
    new_lst.append(i)

>>> print new_lst
[3, 4, 5, 1, 6, 2, 7]

先建立一个新的空列表,通过遍历原来的列表,再利用逻辑关系not in 来去重。
总结:这样可以做出来,但是过程不够简单。但是此方法保证了列表的顺序性

2.利用set的自动去重

lst = [3, 4, 5, 1, 6, 2, 7, 3, 1, 2]
new_lst = list(set(lst))

>>> print new_lst
[1, 2, 3, 4, 5, 6, 7]

将列表转化为set集合再转化为列表,利用set集合的自动去重功能。简单快速。缺点是:使用set方法无法保证去重后的顺序

但是,可以通过列表中索引(index)的方法保证去重后的顺序不变

lst = [3, 4, 5, 1, 6, 2, 7, 3, 1, 2]
new_lst = list(set(lst))
new_lst.sort(key=lst.index)

>>> print new_lst
[3, 4, 5, 1, 6, 2, 7]

参考并感谢

<think> 我们根据用户的问题,需要总结Python中列表的方法。根据提供的引用内容,我们可以整理出几种常见的方法: 1. 使用集合(set)进行:将列表转换为集合,因为集合不允许复元素,然后再转回列表。但这种方法会丢失原列表的顺序。 2. 使用循环遍历构建新列表:遍历原列表,将不复的元素添加到新列表中,这样可以保持原列表的顺序。 3. 使用列表推导式结合条件判断:类似于循环遍历,但用列表推导式实现。 4. 使用filter()函数:结合lambda表达式和count()函数,但这种方法效率可能较低,因为count()会遍历整个列表。 此外,引用[4]中提供了两种保留只出现一次元素的方法(即后只保留唯一元素,而不是保留每个元素的第一次出现),但用户的问题是一般的(即每个元素保留第一次出现的那个),所以我们主要关注前三种方法,注意区分。 用户的问题:查找Python中对列表的方法。我们主要介绍常见的方法,即复元素,保留第一次出现的顺序。 注意:引用[1]提到使用集合(set),但会改变顺序;引用[2]提供了使用循环的方法,可以保持顺序;引用[3]也提到了列表;引用[4]的方法实际上是保留只出现一次的元素(即删除复项,包括删除复出现的所有项,只保留从未复的元素),这与通常的(保留每个元素的第一个)不同。 因此,我们主要介绍: 方法1:使用集合(不保序) 方法2:使用循环遍历(保序) 方法3:使用字典(保序,利用字典键的唯一性,且Python3.7以上字典键保持插入顺序) 方法4:使用collections.OrderedDict(保序,适用于较老版本Python) 另外,我们也可以提到列表推导式结合条件判断(与循环遍历类似)和利用集合的另一种保序方法(使用集合辅助,遍历列表,将未出现的元素加入新列表和集合中)。 由于引用[4]的方法不是常规,我们只简单说明一下。 下面我们进行详细说明。 </think>在Python中,列表是常见操作,以下是几种高效可靠的方法及原理分析: ### 1. 使用集合(set)(无序) ```python original_list = [3, 2, 2, 1, 5, 4, 4] unique_list = list(set(original_list)) # 结果可能为 [1, 2, 3, 4, 5] ``` - **原理**:集合自动过滤复元素 - **特点**: - 时间复杂度 $O(n)$ - 丢失原始顺序 - 仅适用于可哈希元素[^1] ### 2. 有序遍历法(保序) ```python def ordered_deduplicate(lst): seen = set() return [x for x in lst if not (x in seen or seen.add(x))] ``` - **原理**:利用集合检测复,列表推导保序 - **特点**: - 时间复杂度 $O(n)$ - 保留首次出现顺序 - 支持不可哈希元素需改用字典[^2] ### 3. 字典键法(Python 3.7+ 保序) ```python unique_list = list(dict.fromkeys(original_list)) ``` - **原理**:字典键具有唯一性,且Python 3.7+ 保持插入顺序 - **特点**: - 代码最简洁 - 时间复杂度 $O(n)$ - 内存占用较高[^3] ### 4. 计数过滤法(保留唯一值) ```python unique_only = [x for x in original_list if original_list.count(x) == 1] ``` - **原理**:`count()`统计出现次数 - **注意**: - 时间复杂度 $O(n^2)$,大列表性能差 - 会删除所有复项(而非留一个)[^4] > **选型建议**: > - 需保序 → 选择 **有序遍历法** 或 **字典键法** > - 无需顺序 → **集合转换法** > - 超大列表 → 考虑生成器表达式分批处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值