Python列表去重的几种方法

工作中,面试中经常会碰到列表去重的问题,有必要总结下:

方法一: 使用内置set方法来去重

>>> lst1 = [2, 1, 3, 4, 1]
>>> lst2 = list(set(lst1))
>>> print(lst2)
[1, 2, 3, 4]

方法二: 使用字典中fromkeys()的方法来去重

>>> lst1 = [2, 1, 3, 4, 1]
>>> lst2 = {}.fromkeys(lst1).keys()
>>> print(lst2)
dict_keys([2, 1, 3, 4])

方法三: 使用常规方法来去重

>>> lst1 = [2, 1, 3, 4, 1]
>>> temp = []
>>> for item in lst1:
	    if not item in temp:
		    temp.append(item)	
>>> print(temp)
[2, 1, 3, 4]

方法四: 使用列表推导来去重

>>> lst1 = [2, 1, 3, 4, 1]
>>> temp = []
>>> [temp.append(i) for i in lst1 if not i in temp]
[None, None, None, None]
>>> print(temp)
[2, 1, 3, 4]

方法五: 使用sort函数来去重

>>> lst1 = [2, 1, 3, 4, 1]
>>> lst2.sort(key=lst1.index)
>>> print(lst2)
[2, 1, 3, 4]

方法六: 使用sorted函数来去重

>>> lst1 = [2, 1, 3, 4, 1]
>>> lst2 = sorted(set(lst1), key=lst1.index)
>>> print(lst2)
[2, 1, 3, 4]

备注: 前面的几种方法,有几种是不能保证其顺序的,比如用set()函数来处理!

如果要删除列表列表中的重复项,则同样可以用下面的几种方法来处理

>>> # 方法一:
>>> data = [2, 1, 3, 4, 1]
>>> [item for item in data if data.count(item) == 1]
[2, 3, 4]
>>> # 方法二:
>>> data = [2, 1, 3, 4, 1]
>>> list(filter(lambda x:data.count(x) == 1, data))
[2, 3, 4]

<think>好的,用户想了解Python3中列表方法。首先,我需要回忆一下常见的方法,并确保这些方法Python3中适用。根据已有的引用资料,用户提到的几个方法包括使用循环和判断、set()函数、列表推导式等。 首先,方法一:手写循环。这种方法通过遍历原列表,将不复的元素添加到新列表中。引用[1]和[4]都提到了这种方法,特别是引用[4]中的示例代码,保持了原列表的顺序。但需要注意的是,这种方法在数据量大时效率可能较低,因为每次都要检查元素是否在新列表里,时间复杂度是O(n²)。 接下来,方法二:使用set()函数。这是最快捷的方法,因为集合会自动。但引用[1]和[4]提到,这种方法会打乱原列表的顺序,因为集合是无序的。不过,在Python3.7及以上版本中,字典保持插入顺序,所以可以用dict.fromkeys()来保持顺序,如引用[4]中的示例。这一点可能需要进一步验证,因为用户可能不清楚不同Python版本的差异。 然后,方法三:列表推导式结合index()。这种方法通过判断元素在原列表中的第一个出现位置来保留顺序,但同样存在效率问题,因为每次调用index()都需要遍历列表,时间复杂度较高。 另外,用户提供的引用中有提到不同的方法,比如方法四使用字典的fromkeys(),这在Python3中确实是有效的,并且保持了顺序。需要确认这个方法的适用版本,并指出在Python3.7及以上版本才有效。 还要考虑用户可能的实际需求,比如是否需要保持顺序、处理大数据集时的效率等。比如,在数据量大的情况下,使用集合转换可能更高效,但会失顺序;而如果保持顺序很要,可能需要选择其他方法,尽管效率较低。 另外,用户的问题是关于Python3的,所以需要确保所有方法Python3环境中可行。例如,在Python2中某些方法可能不同,但这里不需要考虑。 最后,需要总结这些方法,比较它们的优缺点,帮助用户根据具体情况选择合适的方法。同时,要检查是否有遗漏的方法,比如使用pandas库的drop_duplicates(),但考虑到用户可能希望不依赖外部库,所以可能不需要提及。 现在需要将上述思考整理成结构清晰的回答,分点列出每种方法,并给出示例代码,同时注意引用来源的正确标注。同时,生成相关问题,帮助用户深入理解。</think>### Python3 列表方法总结 #### 方法一:循环遍历法(保留顺序) 通过遍历原列表,仅保留首次出现的元素。 **特点**: - 保持原列表顺序 - 时间复杂度为 $O(n^2)$,适用于小规模数据 ```python a = [3, 2, 2, 1, 4, 3] b = [] for item in a: if item not in b: b.append(item) print(b) # 输出 [3, 2, 1, 4] ``` 参考实现:[^1][^4] --- #### 方法二:集合转换法(不保留顺序) 利用集合(`set`)自动的特性。 **特点**: - 后顺序可能改变 - 时间复杂度为 $O(n)$,效率最高 ```python a = [3, 2, 2, 1, 4, 3] b = list(set(a)) print(b) # 输出可能为 [1, 2, 3, 4] ``` 参考实现:[^2] --- #### 方法三:字典键法(Python 3.7+ 保留顺序) 利用字典键的唯一性,结合 `dict.fromkeys()` 保持顺序。 **特点**: - Python 3.7+ 支持字典键有序 - 时间复杂度为 $O(n)$ ```python a = [3, 2, 2, 1, 4, 3] b = list(dict.fromkeys(a)) print(b) # 输出 [3, 2, 1, 4] ``` 参考实现:[^4] --- #### 方法四:列表推导式 + index()(保留顺序) 通过索引判断元素是否为首次出现。 **特点**: - 保持顺序但效率较低 - 时间复杂度为 $O(n^2)$ ```python a = [3, 2, 2, 1, 4, 3] b = [item for idx, item in enumerate(a) if a.index(item) == idx] print(b) # 输出 [3, 2, 1, 4] ``` 参考实现:[^3] --- #### 方法对比表 | 方法 | 保留顺序 | 时间复杂度 | 适用场景 | |--------------------|----------|------------|-----------------------| | 循环遍历法 | 是 | $O(n^2)$ | 小规模数据 | | 集合转换法 | 否 | $O(n)$ | 无需顺序的大数据 | | 字典键法 | 是 | $O(n)$ | Python 3.7+ 环境 | | 列表推导式 + index | 是 | $O(n^2)$ | 需简洁代码的小数据场景 | ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值