- 使用set set 是一个无序且不含重复元素的集合数据类型。可以通过将list转换成set来去除重复元素,再转回list。但这种方法会丢失原始list的顺序。
my_list = [1, 2, 2, 3, 4, 4, 4]
my_list = list(set(my_list)) # 结果为 [1, 2, 3, 4],但顺序可能会改变
- 使用OrderedDict 在Python 3.6以下的版本,可以使用collections模块中的OrderedDict来去重并保持原始的顺序。
from collections import OrderedDict
my_list = [1, 2, 2, 3, 4, 4, 4]
my_list = list(OrderedDict.fromkeys(my_list)) # 结果为 [1, 2, 3, 4],保持原先顺序
- 通过字典保持顺序 从Python 3.7开始,字典保持插入顺序,所以可以利用这一特性去重,同时保持原来的顺序。
my_list = [1, 2, 2, 3, 4, 4, 4]
my_list = list(dict.fromkeys(my_list)) # 结果为 [1, 2, 3, 4],保持原先顺序
- 使用列表推导式 列表推导式可以在保持原有顺序的同时遍历list并去掉重复元素。
my_list = [1, 2, 2, 3, 4, 4, 4]
unique_list = []
[unique_list.append(x) for x in my_list if x not in unique_list]
# unique_list 现在为 [1, 2, 3, 4],保持原先顺序
运行性能
- 使用set转换
-
- 速度:通常很快,因为转换到set是去重的一种高效方式。但是,这种方法会丢失原有元素的顺序。
- 场景:当不需要保持列表元素的原始顺序时,这是最简单且高效的选择。
- 通过字典保持顺序
-
- 速度:这也是一个相对高效的方法,特别是从Python 3.7开始,因为dict保持插入顺序且内部实现进行了优化。
- 场景:当需要保持元素顺序且使用Python 3.7或更高版本时,此方法非常适用。
- 使用列表推导式
-
- 速度:这可能是上述方法中最慢的,因为它涉及到显式的迭代和条件判断。其性能在列表很大时可能会显著下降。
- 场景:用于列表项不多或对可读性要求高的情况。尽管它不是最高效的,但代码的直观性令人理解容易。
- 使用OrderedDict
-
- 速度:在早期的Python版本(3.6及以前),这是一种有效的保持顺序的去重方式,速度与直接使用字典相近。
- 场景:在使用旧版Python,尤其是需要保持元素顺序时适用。