Python列表去重的多种方法

Python列表去重的多种方法

技术背景

在Python编程中,列表是常用的数据结构之一。有时,我们需要确保列表中的元素是唯一的,即去除列表中的重复元素。Python提供了多种方法来实现列表去重,不同的方法适用于不同的场景,下面将详细介绍这些方法。

实现步骤

方法一:使用集合(Set)

集合是无序且元素唯一的数据结构。将列表转换为集合可以快速去除重复元素,若需要列表形式,再将集合转换回列表。

1
2
3
t = [1, 2, 3, 1, 2, 3, 5, 6, 7, 8]
unique_list = list(set(t))
print(unique_list)

此方法的优点是简单快速,但原列表的顺序会丢失。

方法二:使用OrderedDict(Python 2.7 - 3.6)

在Python 2.7到3.6版本中,可使用OrderedDict来保持元素的插入顺序。

1
2
3
4
from collections import OrderedDict
t = [1, 2, 3, 1, 2, 3, 5, 6, 7, 8]
unique_list = list(OrderedDict.fromkeys(t))
print(unique_list)

方法三:使用字典的fromkeys()方法(Python 3.7及以后)

从Python 3.7开始,字典保证元素按插入顺序排列,可直接使用dict.fromkeys()方法。

1
2
3
t = [1, 2, 3, 1, 2, 3, 5, 6, 7, 8]
unique_list = list(dict.fromkeys(t))
print(unique_list)

方法四:使用循环遍历

通过循环遍历列表,将未出现过的元素添加到新列表中。

1
2
3
4
5
6
t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
s = []
for i in t:
if i not in s:
s.append(i)
print(s)

此方法的时间复杂度为$O(n^2)$,对于大列表效率较低,但适用于元素不可哈希的情况。

方法五:使用列表推导式

使用列表推导式实现类似循环遍历的功能。

1
2
3
L = [1, 2, 2, 3, 4, 2, 4, 3, 5]
newlist = [ii for n, ii in enumerate(L) if ii not in L[:n]]
print(newlist)

该方法同样具有$O(n^2)$的时间复杂度。

方法六:使用Pandas和Numpy

在数据科学领域,可使用PandasNumpy库的相关函数进行去重。

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np

t = ['a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']

# Pandas方法
unique_pd = pd.unique(t).tolist()
print(unique_pd)

# Numpy方法
unique_np = np.unique(t).tolist()
print(unique_np)

Numpyunique()函数会对结果进行排序,若要保留原顺序,可使用return_index参数。

1
2
3
4
t2 = ['c', 'c', 'b', 'b', 'b', 'a', 'a', 'a']
_, idx = np.unique(t2, return_index=True)
unique_np_ordered = t2[np.sort(idx)].tolist()
print(unique_np_ordered)

最佳实践

  • 不考虑顺序且元素可哈希:优先使用set()方法,简单高效。
  • 需要保留顺序且Python版本为3.7及以后:使用dict.fromkeys()方法,代码简洁。
  • 元素不可哈希:使用循环遍历或列表推导式的方法。

常见问题

元素不可哈希

如果列表中的元素不可哈希(如列表、字典等),使用set()OrderedDictdict.fromkeys()方法会报错。此时可使用循环遍历或列表推导式的方法。

性能问题

对于大列表,使用时间复杂度为$O(n^2)$的方法(如循环遍历和列表推导式)会导致性能下降。可考虑使用set()dict.fromkeys()方法。

保留元素首次出现的顺序

使用OrderedDictdict.fromkeys()方法可以保留元素首次出现的顺序。


Python列表去重的多种方法
https://119291.xyz/posts/2025-04-22.python-list-duplicates-removal/
作者
ww
发布于
2025年4月22日
许可协议