首页 > 编程知识 正文

Python删除列表重复元素不改变顺序

时间:2023-11-20 01:40:10 阅读:292988 作者:YPDI

本篇文章将从以下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]

这种方法同样可以保留原列表元素的顺序,并且代码非常简洁。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。