本篇文章将从以下5个方面详细阐述如何使用Python删除列表中的重复元素,同时又不改变原列表中元素的顺序。
一、去重与原列表顺序不变的矛盾
在Python中,列表去重有多种方法。其中最简单也是最常用的方法是使用set()函数。只需要把列表当作参数传入set()函数即可,重复的元素将会被自动删除。
lst = [1, 3, 2, 3, 1, 2]
lst = list(set(lst))
print(lst) # [1, 2, 3]
然而set()函数不会保留原列表的元素顺序,所以这种方法对于需要保持原列表顺序的需求就不适用了。
二、使用字典去重
为了保持原列表的顺序,我们可以使用字典的键唯一性来去重。具体来说,我们可以遍历原列表并将每个元素作为字典的键,对应的值可以暂时设为1,最后取出字典的键即可。
lst = [1, 3, 2, 3, 1, 2]
lst_dedup = {}
for item in lst:
lst_dedup[item] = 1
lst = list(lst_dedup.keys())
print(lst) # [1, 3, 2]
这种方法可以保留原列表元素的顺序,但是需要额外创建一个字典来存储去重后的元素,因此可能会占用更多的内存空间。
三、使用列表生成式
列表生成式是Python中的一种高效生成列表的方式。我们可以使用列表生成式和if语句结合的方式来去重。
lst = [1, 3, 2, 3, 1, 2]
lst_dedup = []
[lst_dedup.append(item) for item in lst if item not in lst_dedup]
print(lst_dedup) # [1, 3, 2]
这种方法也可以保留原列表元素的顺序,同时也不需要额外的字典存储去重后的元素,因此内存空间占用更少。
四、使用生成器函数
Python中的生成器是一种可以迭代的序列对象,可以让程序员遍历一个序列,而不需要占用过多的内存空间。基于生成器,我们可以创建一个生成器函数来对列表进行去重。
def dedup(lst):
deduped = []
for item in lst:
if item not in deduped:
deduped.append(item)
yield item
lst = [1, 3, 2, 3, 1, 2]
lst_dedup = list(dedup(lst))
print(lst_dedup) # [1, 3, 2]
这种方法同样可以保留原列表元素的顺序,并且内存空间占用也非常少。
五、使用顺序字典库
为了解决使用字典去重会导致原列表顺序不对的问题,我们可以使用Python的第三方库ordereddict(在Python 3.7之后,官方的dict也支持顺序了)。这个库可以保留字典的元素插入顺序,并且键唯一性可以用来去重。
from collections import OrderedDict
lst = [1, 3, 2, 3, 1, 2]
lst_dedup = list(OrderedDict.fromkeys(lst))
print(lst_dedup) # [1, 3, 2]
这种方法同样可以保留原列表元素的顺序,并且代码非常简洁。