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
相关产品推荐
相关产品推荐

