You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表去重:保留最后出现的实例,寻求更高效简洁的实现方式

更简洁高效的去重并保留最后出现实例的实现

嘿,你的解法逻辑是通顺的,但确实有更简洁甚至性能更优的实现方式!我来给你分享两种常用的Pythonic思路:

思路1:记录最后出现位置再筛选

利用Python 3.7+中字典**有序(保留插入顺序)**的特性,先遍历一次列表记录每个元素最后出现的索引,然后再遍历原列表,只保留那些当前索引等于最后出现索引的元素:

from typing import List

def keep_last_instances(start: List) -> List:
    # 记录每个元素最后一次出现的索引
    last_pos = {num: idx for idx, num in enumerate(start)}
    # 筛选出仅在最后位置出现的元素
    return [num for idx, num in enumerate(start) if idx == last_pos[num]]

这个实现代码非常简洁,时间复杂度是O(n)(两次线性遍历),和你的原解法复杂度一致,但可读性更强,不需要维护额外的计数变量。

思路2:反向遍历+去重

另一种更高效的思路是反向遍历列表,用集合记录已经添加过的元素,遇到未记录的元素就加入结果列表,最后再将结果反转回原顺序。这样只需要一次线性遍历加一次反转操作,实际运行中可能比第一种思路更快:

from typing import List

def keep_last_instances(start: List) -> List:
    seen = set()
    result = []
    # 反向遍历,确保先遇到最后出现的元素
    for num in reversed(start):
        if num not in seen:
            seen.add(num)
            result.append(num)
    # 反转回原顺序
    return result[::-1]

这种方法的空间复杂度也是O(n),但避免了第二次完整遍历原列表,性能上会更优一些,代码同样简洁易懂。

和原解法的对比

你的原解法通过计数来判断是否是最后一个实例,逻辑没问题,但需要维护total_counts和current_counts两个字典,代码相对繁琐。上面两种思路都不需要额外的计数操作,更符合Python的简洁风格,同时保持了O(n)的时间复杂度。

内容的提问来源于stack exchange,提问作者Johnny Metz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:32:44