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

Python Comprehensions取列表重复元素转set后转列表顺序为何改变

顺序变化的核心原因
  • Python 中的 set 是无序的哈希表结构,设计上就不记录、不保留元素的插入顺序,元素在集合内的存储位置由元素的哈希值、哈希表的当前填充状态共同决定,和元素在原列表中的出现顺序没有关联。
  • 你通过列表推导得到的临时列表内容为 ['d', 'd', 'e', 'e'],转 set 后内部的元素排序规则和原列表完全无关,后续调用 list() 转换时会直接读取 set 内部的存储顺序生成列表,所以最终结果顺序和你预期的原列表出现顺序不一致。

保留顺序的实现方案

如果需要保留重复元素在原列表中的首次出现顺序,可参考以下两种实现:

  1. 适配Python3.7+版本(原生字典默认保序)
lis = ['a', 'b', 'c', 'd', 'd', 'e', 'e']
duplicates = list(dict.fromkeys([x for x in lis if lis.count(x) > 1]).keys())
# 输出结果为 ['d', 'e'],和原列表出现顺序一致

如果需要兼容Python3.7以下版本,替换dict为collections.OrderedDict即可。

  1. 大列表优化方案(仅遍历1次列表,效率更高)
from collections import Counter
lis = ['a', 'b', 'c', 'd', 'd', 'e', 'e']
count_map = Counter(lis)
duplicates = [k for k, v in count_map.items() if v > 1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:54:03