方法一:使用 set()(最常用,但无序)
这是最简单、最直接的方法。利用集合 (set) 元素唯一的特性进行去重。
特点:
-
优点:代码简洁,执行效率高。
-
缺点:不保持原列表的顺序(因为集合是无序的),并且得到的元素类型是
set,如果需要列表,需再转换。
示例:
my_list = [3, 5, 2, 1, 4, 3, 2, 5, 'apple', 'banana', 'apple']
unique_list = list(set(my_list))
print(unique_list)
# 输出可能是:[1, 2, 3, 4, 5, 'banana', 'apple'] (顺序随机)
方法二:使用 dict.fromkeys()(高效且保序)
利用字典键的唯一性来去重。从 Python 3.7 开始,字典正式成为有序的(实际上从 3.6 开始已经如此),所以这个方法可以完美地保留元素的首次出现顺序。
特点:
-
优点:保持原列表的顺序,执行效率非常高(和
set方法接近)。 -
缺点:逻辑上稍微绕一点,但仍然是推荐的方法。
示例:
my_list = [3, 5, 2, 1, 4, 3, 2, 5, 'apple', 'banana', 'apple']
unique_list = list(dict.fromkeys(my_list))
print(unique_list)
# 输出:[3, 5, 2, 1, 4, 'apple', 'banana'] (完美保留首次出现的顺序)
方法三:使用循环遍历(最基础,保序)
创建一个新列表,遍历原列表,只将新列表中不存在的元素添加进去。
特点:
-
优点:代码逻辑清晰易懂,保持原列表的顺序。
-
缺点:效率较低,因为每次检查
not in都需要遍历新列表。对于大数据量列表(如上万个元素)会比较慢。
示例:
my_list = [3, 5, 2, 1, 4, 3, 2, 5, 'apple', 'banana', 'apple']
unique_list = []
for item in my_list:
if item not in unique_list:
unique_list.append(item)
print(unique_list)
# 输出:[3, 5, 2, 1, 4, 'apple', 'banana']
方法四:使用列表推导式(方法三的简洁写法)
本质和方法三一样,只是用更简洁的列表推导式 (list comprehension) 来实现。
特点:
-
优点:代码简洁,保持原列表的顺序。
-
缺点:和方法三一样,效率较低,不适用于大数据集。
示例:
my_list = [3, 5, 2, 1, 4, 3, 2, 5, 'apple', 'banana', 'apple']
unique_list = []
[unique_list.append(item) for item in my_list if item not in unique_list]
print(unique_list)
# 输出:[3, 5, 2, 1, 4, 'apple', 'banana']
(注意:这个列表推导式的主要目的是为了追加元素,其最终结果 unique_list 是目标,而推导式本身会产生一个充满 None 的列表,通常被忽略。)
总结与选择建议
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
set() | 速度最快 | 不保序,转为集合类型 | 对顺序没有要求,只关心唯一元素,且追求最高性能 |
dict.fromkeys() | 速度很快,保序 | - | 绝大多数情况下的首选,兼顾了性能和顺序 |
| 循环遍历/列表推导式 | 逻辑简单,保序 | 速度慢(时间复杂度 O(n²)) | 列表很小,或者对性能不敏感,且需要代码非常清晰易懂时 |
最佳实践:
如果你需要保留元素出现的原始顺序,请毫不犹豫地使用 dict.fromkeys() 方法。 它是目前 Python 中实现有序去重的惯用写法和性能最佳实践。
# 最佳实践:高效且保序
def remove_duplicates(lst):
return list(dict.fromkeys(lst))

578

被折叠的 条评论
为什么被折叠?



