python中的列表去重的四种方法

方法一:使用 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值