Skip to content

在 Python 中去除列表中的重复项

Posted on:2024年6月17日 at 13:54

在处理Python中的列表时,去除重复项是一个常见的问题。这里将介绍几种方法来检查列表是否有重复项,并返回一个没有重复项的新列表。

使用集合(set)

集合(set)是Python中用于存储不重复元素的集合。可以将任何可迭代对象转换为集合,然后再将集合转换回列表,以去除重复项。这是最常见的解决方法。

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

需要注意的是,集合是无序的,这意味着原始列表中的顺序不会被保留。

保持顺序的方法

如果需要保留原始列表中的顺序,可以使用OrderedDict或从Python 3.7开始的内置字典,因为它们在插入时保留顺序。

使用OrderedDict

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

使用内置字典(适用于Python 3.7及以上版本):

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

这两种方法都会保持原始列表中的顺序,但可能会有创建字典和列表的额外开销。如果不需要保留顺序,使用集合会更加高效。

处理不可哈希类型

如果列表中的元素是不可哈希的(例如嵌套的列表),可以使用以下方法:

t = [{'a': 1}, {'b': 2}, {'a': 1}]
unique_list = [dict(d) for d in set(frozenset(item.items()) for item in t)]
print(unique_list)  # 输出:[{'a': 1}, {'b': 2}]

这种方法将字典转换为frozenset,使其可哈希,然后再转换回字典。

性能考虑

尽管使用集合或字典可能在时间和空间上有一定的开销,但在大多数情况下,这些方法都能高效地去除重复项。如果性能是关键,可以对不同方法进行基准测试以确定最适合的解决方案。